反射学习笔记
反射学习笔记
反射就是把java类中的各种成分映射成相应的java类,包括java类本身。每一个java类都是Class类的一个实例对象,每一个方法都是Method类的一个实例对象······ 反射很好地体现了“万物皆对象”的本质,可以很好地帮助我们理解面向对象的本质。
获取Class实例的三种方式:
1.className.class 即指定一份字节码文件
2.Class.forName(String className) 使用Class类中的静态方法forName()
3.obj.getClass() 通过一个对象调用getClass()方法获取
获取类中的构造器:
Class类提供了四种方法获取构造器:
1.public Constructor<?>[ ] getConstructors() 获取一个类中的所有公共构造器(不包括私有构造器)
2..public Constructor<?>[ ] getDeclaredConstructors() 获取一个类中所有的构造器(包括私有的),与权限无关
3.public Constructor<?> getConstructor(Class<?> ...parameterTypes) 获取指定构造器(除私有构造器外),参数为类型的字节码文件
4.public Constructor<?> getDeclaredConstructor(Class<?> ...parameterTypes) 获取指定构造器,包括私有的
利用获取的构造器创建对象
通过调用Constructor类中的newInstance(Object... initargs)方法;
若需要访问私有构造器,可调用AccessibleObject类中的setAccessible(boolean flag)方法,参数设置为true
获取类中的方法:(有四种方式,与获取构造器类似)
1.public Method[ ] getMethods() 获取类中的所有公共方法(不包括私有方法)
2.public Method[ ] getDeclaredMethods() 获取类中的所有方法(包括私有方法),与权限无关
3.public Method getMethod(String MethodName,class<?>....parameterTypes) 获取指定的公共方法
参数:MethodName 方法名称
parameterTypes 方法参数类型的字节码文件
4.public Method getDeclaredMethod(String MethodName,class<?>....parameterTypes) 获取指定的所有方法(包括私有的)
调用所获取的方法
使用Method类中的 public Object invoke(Object obj , Object....param)
参数:obj 表示所调用方法的底层所属对象
param 表示传递给方法的实参
如果要调用私有方法,与调用私有构造器相似。(要先设置setAccessible(boolean flag)方法的参数为true)
调用静态方法时,obj的参数值为null,但不可省略不写。
关于 invoke 方法的补充:若所调用方法的参数为可变参数类型,则该参数为一个数组,该方法底层会自动解包,可能会导致异常发生。为解决该异常,要先用 Object 的一维数组把实际参数包装起来。即 new Object[ ] {实际参数} 。
获取类中的字段
也有四种方法,与获取方法的方式大致相同,此处不再赘述。