java不是动态语言,但他有一个动态相关机制:Reflection反射。在运行状态中:
1)对于任意一个实体类,可以获取它的所有属性和方法; 2)对于任意一个对象,可以调用它的方法和属性。
总结来说,动态获取信息以及动态调用对象方法的功能称为java反射机制。
正常情况下这样获取对象:
使用import导入所在包; 明确的使用类名称或接口名称定义对象; 通过关键字new进行类对象的实例化;
反射直接利用Object与反射机制的混合调用类中的方法,不需要明确类型的对象,所有的对象使用Object表示。
举例:通过一个字节码文件(.class) 怎样知道这个字节码文件中有什么方法和属性?
方法就是反射。
在JDK中提供了Class对象来保存类的信息。
反射的第一步就是得到Class对象。
在JDK中提供了如下方式得到Class对象:
public static void main(String[] args) { //方法一Class.forName("路径");: try { Class.forName("Test1"); //必须是该类的完整路径 } catch (ClassNotFoundException e) { e.printStackTrace(); } //方法二(类名.class,推荐使用,代码安全): Class clazz=Test1.class; //方法三(调用对象的方法): Test1 test1=new Test1(); test1.getClass(); }此方法需要有2个条件:
第一,forName中的字符串必须是全限定名; 第二,这个Class类必须在classpath的路径下面,因为该方法会抛出 ClassNotFoundException 的异常。
获取到这个Class对象之后,就可以得到类的各种信息。
获取Class对象 通过反射生成对象 获取方法
getDeclaredMethods()方法返回类或者接口声明的所有方法,但不包括集成的方法。 getMethods()方法返回某个类的所有公有(public)方法。 getmethod()方法返回特定的方法,第一个参数为方法名,后面的参数为方法对应的Class对象。
获取构造器信息 获取类的成员变量信息
getFiled:访问公有的成员变量。 getDeclareField:所有已声明的成员变量。但不能得到其父类的成员变量。 getFileds和getDeclaredFields
调用方法 invoke()方法
下面这篇文章对反射的内容讲的十分详细透彻,推荐阅读,也留存备用:
https://blog.csdn.net/u012562943/article/details/54405941
https://blog.csdn.net/lijizhi19950123/article/details/78141792
https://blog.csdn.net/stranger_bai/article/details/83715604