java反射描述:
1.反射机制是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法。 2.对于任意一个对象,都能够调用它的任意一个方法和属性。 这种动态获取信息和动态调用对象的方法的功能称为java的反射机制。 简单定义:可以动态类中的信息,就是反射。也就是对类的解剖。
2.java用类来体现字节码文件的描述:Class,它提供了获取类中的所有信息,反射就是依靠该类来完成的。 想要对一个类进行解剖只需要获取这个类的字节码对象即可。
获取字节码对象的方法有:
1.Object为右眼的getClass()方法。 这中方式必须要明确具体的类。
2.任何对象都具有静态属性.class来获取并创建对象。 但是还是要明确到类的静态成员。
3.用Class中的forName来完成。给定字符串(要包括完整包名)就可以得到该Class类,这是最好的方式。
第三种方式与new 一个对象的区别:new一个对象,当new完过后就去找到这个字节码文件,并加到内存,然后再 创建字节码文件对象,再创建对应的对象。 Class.forName();直接到指定包中找到字节码文件,然后加载到内存中,产生Class对象,接着newInstance()创建对应的对象。
获取构造函数:
1. newInstance相当于调用了一个空的构造函数。 所以这个空的构造函数一定要存在,而且不能是私有的,最好是共公的。
2. 如果它的构造函数还有参数且不只一个,可以通过getDeclaredConstructors/getConstructor(Class<?>...)来获取。 例如:getConstructor(String.class,int.class);返回一个Constructor对象。以通过该Constructor对象 的newInstance来实例化,返回一个Object 对象,从而实现了其它构造函数的调用。
获取字段:
1. getField("age");//获取字段,传入字段的名称。该字段必须是公共的,可以是父类
2.getDeclaredField("age");//获取字段,只获取本类中,可以是任何类型。返回Field
3.Filed中可以调用.get(对象)/.getX(对象),取得该字段的值,但是如果这个字段必须要是公共的,否则无法获取。
4.如果想要获取非公有的字段的值,那么要看:AccessibleObject它的父类了。 可以用Field.setAccessible(true),取消权限检查。就可以通过2来获取或设置值了。
获取方法:
1.getMethods 获取方法,必须是公共的。
2.暴力访问取得非公有的方法。 getDeclaredMethod(String name,Class..params);方法名,参数的class(拿构造不需要name)
3.运行一个方法:method.invoke(对象,该方法的参数);