一.java反射是基于java的类加载机制
jvm在运行某个XXX类时会在堆中建立名为XXX.class的文件对象(一般只此一份)
二.java发射的三种实现方式
1.对象获取
new XXX =new XXX();
Class c1 =XXX.getClass();
2.类名获取
Class c2 = XXX.class;
3.class类的静态方法获取(最常用)
Class c3 =Class.forName(“全限定名”);
Constructor[] cons = c3.getConstructors();
for(Constructor con:cons){
System.out.print(con);
}
当要获取特定的构造器对象时:
Constructor con = c3.getConstructor(参数列表.class):
con.newInstance(“传入与上一步传入的参数列表一致的参数”);//传入与上一步传入的参数列表一致的参数
注意:XXX类中要有空构造器,以及必须要有public构造器有空构造器就可以快捷进行反射
Class c3 =Class.forName(“全限定名”);
c3.newInstance();
三.暴力反射
通常不会对类的私有化方法进行反射操作,因为可能出现风险。
当然技术上没有难度。
通过Class类的getDeclaredConstructors();可以获取所有构造器方法(包含private的);
获取特定私有构造器方法:
Constructor con = c3.getDeclaredConstructor(参数名.class的列表);
con.setAccessible(true);//取消运行时的检查
四.反射获取成员变量中的成员变量,并改值
Class c3 =Class.forName(“全限定名”);
c3.getFields();//获取的都是public修饰的成员变量
c3.getDeclaredFields();//获取所有成员变量
获取某个public成员变量并改值
Field f = c3.getField(“变量名”);
Object obj = c3.newInstance();
f.set(obj,“修改的值”);
五.反射获取方法
Class c3 =Class.forName(“全限定名”);
Object obj = c3.newInstance();
c3.getMethods(); //获取所有的公共方法
Method m = getMethod(“方法名”,参数.class列表);
//使用Method方法类中的方法,获取到具体方法
m.invoke(obj,实际参数(列表));
java反射
最新推荐文章于 2023-07-20 15:13:23 发布