说起反射大家应该都不陌生,在我们使用的各种框架中大量的运用了反射技术,反射机制允许程序在执行期间借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法.简单的理解为就是将类的各个部分封装为其他对象,这就是反射机制,优点是,可以解耦,提高程序拓展性,让程序更加灵活,可以在程序运行过程中操作这些对象,缺点是反射的效率是非常慢的.
首先我们先说一说类的加载机制,在java中类的加载是通过类加载器加载的,类加载器的作用就是把class文件装入到内存中,然后生成一个代表这个类java.lang.Class对象,在加载完毕之后还会有一个链接和初始化的过程.一个加载的类在JVM中只有一个Class对象,一个类被加载后,类的整个结构都会被封装在class对象中,包含了完整的类的结构信息,我们就可以通过Class获取一个类中所有被加载的结构.
Class类是java反射的源头,Class本身也是一个类,一个Class对象对应一个.class文件,所以我们在使用反射的时候要先获取Class对象,那些类型具有Class对象呢?接口,数组,枚举,注解,void,包装类(Interger…)和class(内部类,成员(成员内部类,静态内部类),局部内部类,匿名内部类)
,下面就给大家介绍获取class对象的方法
1.最安全可靠,性能最好的就是直接通过类的class属性获取
Class clazz = Cat.class;
2.通过实例的getClass()获取Class对象
Cat cat = new Cat();
Class clazz = cat.getClass();
3.通过全类名的方式获取,需要抛出ClassNotFoundException
Class clazz = Class.forName("com.easy.reflect.Demo.Cat");
4.包装类可以直接通过.Type获得类的实例
Integer.Type;
5.我们也可以通过子类获得父类的实例对象
cat.getSuperCalss();
常用方法
//获取包名+类名
cat.getName()
//获得类名
cat.getSimpleName();
//获得类的public属性
cat.getFields();
//加了Declared就可以获得所有的属性
cat.getDeclaredFields();
//获得本类及其父类的全部public方法
Method[] methods = cat.getMethods();
//获得指定方法
//重载
//空参函数
Method getNames = cat.getMethod("getName", null);
//参数为String名为setName的方法
Method setName = cat.getMethod("setName", String.class);
//获得指定的构造器
constructors=cat.getDeclaredConstructor();
//通过反射获得注解
Annotation[] annotations = cat.getAnnotations();