反射

反射

就是通过反射技术,底层(JVM)可以解析.class文件里的所有数据包括:类里的所有信息,成员变量/方法/构造方法...
好处:节省内存资源

获取反射类对象

class.forName("类的全路径")
类名.class
对象.getclass()

常用方法

对象名.getPackage().getName()获取包名
对象名.getSimpleName()获取类名
对象名.getName()获取完整类名
getFields()获得所有公开的成员变量,包括继承的变量
getField(变量名)
getDeclaredFields()获得本类定义的成员变量,包括私有,不包括继承的变量
getDeclaredField(变量名)
getConstructor(参数类型列表)获得公开的构造方法
getConstructors()获得所有公开的构造方法           
getDeclaredConstructors()暴力获得所有构造方法,包括私有
getDeclaredConstructor(参数类型.class)
getMethods()获得所有可见的方法,包括继承的方法
getMethod(方法名,参数类型列表)
getDeclaredMethods()暴力获得本类定义的方法,包括私有,不包括继承的方法
getDeclaredMethod(方法名, 参数类型.class)更具方法名和参数类型及其个数自动匹配
Class.newInstance() 只能够调用无参的构造函数,即默认的构造函数; 
Constructor.newInstance() 可以根据传入的参数,调用任意构造构造函数。 
c.getConstructor(类型.class); 执行含参构造,获取构造方法
c.getDeclaredField(变量名); 获取变量
c.setAccessible(true); 使私有成员允许访问
f.set(实例, 值); 为指定实例的变量赋值,静态变量,第一参数给 null
f.get(实例); 访问指定实例的变量的值,静态变量,第一参数给 null
Method m = c.getDeclaredMethod(方法名, 参数类型列表);
m.setAccessible(true) ;使私有方法允许被调用
m.invoke(实例, 参数数据) ;让指定的实例来执行该方法

注意点

当暴力反射时有私有的构造方法时,需要先暴力获取构造方法,完了在实例化




你可能感兴趣的:(java)