如果要进行深究,那首先必须要清楚java类的执行历程:
1.编译:把源程序编译成.class文件
2.加载:JVM装载.class,也就是类装载器装载类字节码
3.最后进行连接
附执行图一张
-
什么是Java反射机制
Java的反射机制是在程序运行时,能够完全知道任何一个类,及其它的属性和方法,并且能够任意调用一个对象的属性和方法。这种运行时的动态获取就是Java的反射机制。其实这也是Java是动态语言的一个象征。总结说:反射就是把java类中的各种成分映射成一个个的Java对象,并且可以进行操作。 -
java反射的原理
Java的反射就是利用上面执行历程中加载到jvm中的.class文件来进行操作的。.class文件中包含java类的所有信息,当你不知道某个类具体信息时,可以使用反射得到class,获取类对象,然后进行各种操作 -
java反射获取.class的方式
1.对象调用 getClass() 方法来获取,通常应用在不知道具体是什么类的情况下
2.类名.class 的方式得到,比较常用,更加可靠
3.通过 Class 对象的 forName() 静态方法来获取
Class具有的部分方法如下:
getName():获得类的完整名字。
getFields():获得类的public类型的属性。
getDeclaredFields():获得类的所有属性。包括private 声明的和继承类
getMethods():获得类的public类型的方法。
getDeclaredMethods():获得类的所有方法。包括private 声明的和继承类
getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。
getConstructors():获得类的public类型的构造方法。
getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。
newInstance():通过类的不带参数的构造方法创建这个类的一个对象。
1、Class clazz1 = Class.forName(“全限定类名”); //通过Class类中的静态方法forName,直接获取到一个类的字节码文件对象,此时该类还是源文件阶段,并没有变为字节码文件。
2、Class clazz2 = Person.class; //当类被加载成.class文件时,此时Person类变成了.class,在获取该字节码文件对象,也就是获取自己, 该类处于字节码阶段。
3、Class clazz3 = p.getClass(); //通过类的实例获取该类的字节码文件对象,该类处于创建对象阶段