一、反射机制 :
将类的各个部分 组成一个新的对象(Class 对象) 就是反射机制
二、获取反射对象
通过 对象名.getClass()
通过 类名.class 来获取
Class.forName(“完整的包名+类名”)
Person person = new Person();
Class pClass1 = person.getClass();
Class pClass2 = Person.class;
Class pClass3 = Class.forName("com.project.demo.Person");
三、 获取构造方法
public Constructor<?>[] getConstructors():获取所有的公有的构造方法
public Constructor<?>[] getDeclaredConstructors():获取所有的构造方法
public Constructor<T> getConstructor(@RecentlyNullable Class<?>... parameterTypes):获取单个共有构造方法
public Constructor<T> getDeclaredConstructor(@RecentlyNullable Class<?>... parameterTypes):获取单个私有构造方法
Class cla = Class.forName("com.project.demo.Person");
//获取私有的单个构造方法(匹配参数)
Constructor con = cla.getDeclaredConstructor(String.class);
//对于私有构造方法需要使用暴力反射去除私有
con.setAccessible(true);
//通过反射来实例化对象 Person per = new Person()
Person per = (Person) con.newInstance("p");
四、获取成员方法
public Method[] getMethods():获取所有的公有的方法包括父类方法
public Method[] getDeclaredMethods():获取所有方法
public Method getMethod(@RecentlyNonNull String name, @RecentlyNullable Class<?>... parameterTypes):获取单个公有的方法
public Method getDeclaredMethod(@RecentlyNonNull String name, @RecentlyNullable Class<?>... parameterTypes):获取单个私有的方法
Class cla = Class.forName("com.project.demo.Person");
//获取私有的单个构造方法(匹配参数)
Constructor con = cla.getDeclaredConstructor(String.class);
//对于私有构造方法需要使用暴力反射去除私有
con.setAccessible(true);
//通过反射来实例化对象 Person per = new Person()
Person per = (Person) con.newInstance("p");
//获取私有的成员方法(匹配方法名和参数)
Method met = cla.getDeclaredMethod("speck",String.class);
//使用暴力反射去除私有
met.setAccessible(true);
//调用方法
Object o = met.invoke(per,"阿豪");
五、反射获取成员变量
public Field[] getFields():获取公有的成员变量
public native Field[] getDeclaredFields():获取所有的成员变量
public Field getField(@RecentlyNonNull String name):获取单个共有成员变量
public native Field getDeclaredField(@RecentlyNonNull String var1):获取单个私有的成员变量
Class cla = Class.forName("com.project.demo.Person");
//获取私有的单个构造方法(匹配参数)
Constructor con = cla.getDeclaredConstructor(String.class);
//对于私有构造方法需要使用暴力反射去除私有
con.setAccessible(true);
//通过反射来实例化对象 Person per = new Person()
Person per = (Person) con.newInstance("p");
Field f =cla.getDeclaredField("age");
//使用暴力反射去除私有
f.setAccessible(true);
//设置成员变量值
f.set(per,18);
网友评论