一.什么是反射

  在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的方法的功能就称为java语言的反射机制。

二.为什么需要反射

  首先我们要了解Java的编译类型有两种:

    1.静态编译:在编译时确定类型,绑定对象即通过。

    2.动态编译:运行时确定类型,绑定对象。动态编译最大限度地发挥了Java的灵活性,体现了多态的应用,可以减低类之间的耦合性。

  而Java反射机制在Java动态编译的起到了一个关键作用。

三.反射获取Class对象的三种方式(获取字节码对象)

public class ReflectDemo1 {public static void main(String[] args) throws ClassNotFoundException {//方式一(通过Class.forName的方式,括号中是包名.类名)常用Class clazz1 = Class.forName("xx.ReflectDemo1");//方式二(类名.class)Class clazz2 = ReflectDemo1.class;//方式三(创建类的实例对象,再通过getClass的方式)ReflectDemo1 ref = new ReflectDemo1();Class clazz3 = ref.getClass();System.out.println(clazz1 == clazz2);//trueSystem.out.println(clazz2 == clazz3);//true,三个字节码对象是同一个字节码对象
    }
}

四.通过反射获构造器,成员变量,方法等

public class ReflectDemo2 {private String name;public ReflectDemo2(String name) {super();this.name = name;}@Overridepublic String toString() {return "[name=" + name + "]";}public void method1(){System.out.println("你好啊");}public void method2(String name){System.out.println("hello"+name);}public static void main(String[] args) throws Exception {//通过反射获取有参构造,并通过有参构造创建对象Class clazz = Class.forName("course9.ReflectDemo2");Constructor c = clazz.getConstructor(String.class);ReflectDemo2 ref = (ReflectDemo2) c.newInstance("zx");System.out.println(ref);//通过反射获取成员变量并使用Field f = clazz.getDeclaredField("name");//获取姓名字段(暴力反射获取,即使是私有变量)f.setAccessible(true);//设置去除私有权限f.set(ref, "ls");System.out.println(ref);//通过反射获取方法并使用Method m1 = clazz.getMethod("method1");Method m2 = clazz.getMethod("method2",String.class);m1.invoke(ref);m2.invoke(ref,"张三");}
}

输出结果如下:

五.通过反射越过泛型检查

public class ReflectDemo3 {public static void main(String[] args) throws Exception {//使用反射越过泛型的检查ArrayList<Integer> list = new ArrayList<>();//创建一个存放整型的链表list.add(11);list.add(22);Class clazz = Class.forName("java.util.ArrayList");//获取java.util.ArrayList类的字节码对象Method m = clazz.getMethod("add", Object.class);//获取其中的add方法m.invoke(list, "abc");//链表中添加字符串System.out.println(list);}
}

输出结果如下:(“abc”不是Interger类型,但是能存放在创建的链表中)

六.反射实现动态代理

public class ReflectDemo4 implements User{public static void main(String[] args) {ReflectDemo4 ref = new ReflectDemo4();ref.add();ref.delete();MyInvocationHandler m = new MyInvocationHandler(ref);//创建动态代理类(放入需要代理的对象)User user = (User) Proxy.newProxyInstance(ref.getClass().getClassLoader(), ref.getClass().getInterfaces(), m);//获取类加载器和接口
        System.out.println("-----------------------");user.add();user.delete();}@Overridepublic void add() {System.out.println("添加功能");
    }@Overridepublic void delete() {System.out.println("删除功能");
    }
}
interface User{public void add();public void delete();
}//动态代理类
class MyInvocationHandler implements InvocationHandler{private Object target;public MyInvocationHandler(Object target) {super();this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("权限校验");method.invoke(target, args);//执行被代理target对象的方法System.out.println("日志记录");return null;}}

输出结果如下:(动态代理前的输出和代理后的输出)

七.反射的一些应用

  如加载一些文件

  逆向代码 ,例如反编译

  与注解相结合的框架 例如Spring

  动态生成类框架 例如Gson

转载于:https://www.cnblogs.com/ywb-articles/p/10588298.html

【Java】 Java反射机制总结相关推荐

  1. Java的反射机制 工厂模式综合讲解【转载自51CTO】

    2019独角兽企业重金招聘Python工程师标准>>> Java的反射机制 工厂模式综合讲解 1.什么叫反射 Java.lang.reflect包下 正常情况下我们可以通过类实例化一 ...

  2. java xml 反射_Java 读取XML文件以及Java 的反射机制实现

    Java 读取XML文件以及Java 的反射机制实现 代码部分 import java.io.File; import javax.xml.parsers.DocumentBuilder; impor ...

  3. Java编程:Java的反射机制中的 getComponentType() 方法

    转载自  Java编程:Java的反射机制中的 getComponentType() 方法 Java 中所有的类都继承自 Object,数组本身也是一个 Class,如果我们能够得到数据的 Class ...

  4. 搞懂Java的反射机制

    搞懂Java的反射机制 1.什么是反射? java的反射机制是指可以在运行状态下获取类和对象的所有属性和方法. 2.反射的作用? 1.在运行时获取一个类/对象的成员变量和方法 2.在运行时创建一个类的 ...

  5. java原理—反射机制

    http://www.cnblogs.com/forlina/archive/2011/06/21/2085849.html 一.什么是反射: 反射的概念是由Smith在1982年首次提出的,主要是指 ...

  6. java反射之获取class对象,Java之反射机制(获取Class对象的三种方式)

    Java之反射机制(获取Class对象的三种方式) 开发工具与关键技术:MyEclipse 10,java 作者:刘东标 撰写时间:2019-06-14 如何得到各个字节码对应的实例对象? 每个类被加 ...

  7. 学习:java原理—反射机制

    一.什么是反射: 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提 出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序 ...

  8. Java —— Reflect反射机制

    JAVA反射机制是在运行时,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java的反射机制. ...

  9. 什么是Java的反射机制

    Java反射机制是Java的特点,是框架实现的基础,百度结果: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这 ...

  10. 什么是Java的反射机制?

    Java 的反射机制是使其具有动态特性的非常关键的一种机制,也是在JavaBean 中广泛应用的一种特性. 运用JavaBean 的最常见的问题是:根据指定的类名,类字段名和所对应的数据,得到该类的实 ...

最新文章

  1. 沈向洋官宣离职微软!他是微软级别最高的中国人、微软AI领导者,21年前参与创办MSRA...
  2. H3C交换机引发的奇葩故障
  3. Python:zip()函数
  4. PageLayoutControl的基本操作
  5. 工作335:uni-增加表单验证
  6. Wireshark文档阅读笔记-WebSocket协议基本概念
  7. Python编程高手之路——第二章:流程控制
  8. 【实验4】——互谱法测向
  9. js中元素(图片)切换和隐藏显示问题
  10. Python实战从入门到精通第二讲——类
  11. android课程设计实训目的,汽车专业实习目的与意义
  12. 【ACM】 1231 最大连续子序列
  13. python与人工智能的关系_广东江门的北大青鸟学校了解到人工智能与Python关系
  14. 使用akka框架编写RPC框架
  15. WebSocket心跳检测和重连机制
  16. 大学计算机课程日记,大学计算机实习日记_
  17. 把字符串中的全角数字替换成半角数字 0123456789 转换成 0123456789
  18. 数据科学的原理与技巧 五、探索性数据分析
  19. Java Reactor Stream
  20. ttttttttttt

热门文章

  1. 01 按指定格式读写文件出现乱码
  2. 2018年秋计算机应用基础本科,广东开放大学远程教育专科2018年秋计算机应用基础Word模块测试...
  3. 差点无缘Offer!java开发和运行环境实验报告
  4. inl和dnl matlab_请问如何用matlab仿真它的性能, 比如 INL, DNL, SFDR,EOB等等。
  5. zookeeper清空hbase_HBase在zookeeper下不创建目录
  6. 数学建模层次分析法例题及答案_斩获国际特等奖!兰理工数学建模团队为百年校庆献礼...
  7. css 中引入第三方字体
  8. vue3中v-model的重大更新
  9. 泄密Number的数据类型转换
  10. c语言const 修饰二级指针,C++中const修饰二级指针(从类型‘int**’到类型‘const int**’的转换无效)...