反射学习总结

反射其实就是一种Java程序的自审机制,可以在不知道别的类的内部结构的情况下,通过反射获得类的方法,成员变量等等,从而完善类的后续操作;同时也可以通过反射来发现很多运行时的错误。

Class类:
在java中,静态成员,普通数据类型类不是对象。
类是对象,类是java.lang.Class类的实例对象,这个对象我们成为该类的类类型。例如,新建一个Student类,Student s1=new Student(),这个类也是对象,是java.lang.Class类的实例对象。有三种表示方式:
  1. Class c1=Student.class;
  2. Class c2=s1.getClass();  //c1,c2表示了Student类的类类型(class type)
  3. Class c3=null; c3=Class.forName("类的全称,比如com.imooc.reflect.Student")
我们完全可以用过类的类类型创建该类的对象实例: Student stu=(Student)c1.newInstance().//前提是需要有无参数的构造方法

c1==c2==c3,不管c1 or c2都代表了Student类的类类型,一个类只可能是Class类的一个实例对象。

Class.forName("类的全称"):不仅表示了类的类类型,还代表了动态加载类
编译时刻加载类是静态加载类、运行时刻加载类是动态加载类。
new创建对象,是静态加载类,在编译时刻就需要加载所有的可能使用到的类。

如果要获取类的方法的信息:Method
getMethods()方法获取的是所有public的函数,包括父类继承而来的共有方法;
getDeclaredMethods()获取的是所有该类自己声明的方法,不问访问类型

如果获取成员变量的信息:java.lang.reflect.Field
getFields()方法获取的是所有public成员变量的信息;
getDeclaredFieds()方法获取的是该类自己声明的成员变量的信息。

如果获取对象的构造函数的信息:java.lang.Constructor
get Constructors():获取所有的public的构造函数
getDeclared Constructors():得到所有的构造函数。

方法的反射:invoke方法

要获取方法,就是要获取类的信息,首先要获取累的类类型。

开放性和原因连接是反射系统的两大基本要素:
  1. 实现了反射机制的系统都具有开放性,但具有开放性的系统并不一定采用了反射机制,开放性是反射系统的必要条件。
  2. 所谓原因连接,是指反射系统自描述的改变能够立即反映到系统底层的实际状态和行为上的情况,反之亦然。

如何优化反射性能:
  1. 善用API:比如尽量不要getMethods()后在遍历筛选,而直接用getMethod(methodName)来根据方法名获取方法。
  2. 使用缓存。将反射得到的元数据保存下来,从缓存中调用。

反射的操作都是编译之后的操作。
Java中集合的泛型,是防止错误输入的,只在编译阶段有效,绕过编译就无效了。也就是说编译之后集合的泛型是去泛型化的。绕过编译操作,就是绕过泛型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值