什么是暴力反射?
指可以将程序中的私有的属性或者方法通过反射技术,暴力的获取到资源。需要使用的常见方法如下:
暴力反射获取变量名并修改变量名
类:
class Hospital00007{
private String name="常熟第一人民医院";
private int num= 138;
private void run(String name,int num){
System.out.println(name+"有:"+num+"人");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
方法
private static void method01() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Class<?> clazz =Class.forName("Hospital00007"); //创建字节码对象(参数:类的全限定名)
Hospital00007 hospital =(Hospital00007) clazz.newInstance(); //创建实例对象
// 修改变量名前
Field[] fields =clazz.getDeclaredFields(); //获取变量名
for(Field f :fields){
f.setAccessible(true);
System.out.println(f.getName()+"="+f.get(hospital)); //获取变量名 和 变量值
}
System.out.println(fields[0].get(hospital)+"="+fields[1].get(hospital));
System.out.println("*********************************************************");
//修改变量名后
fields[0].set(hospital,"苏州广慈医院");
fields[1].set(hospital,99);
for(Field f :fields){
System.out.println(f.getName()+"="+f.get(hospital));
}
System.out.println(hospital.getName()+"="+fields[1].get(hospital));
}
暴力反射获取类中的所有方法并执行指定的方法
private static void method02() throws ClassNotFoundException, InstantiationException, IllegalAccessException, InvocationTargetException {
Class<?> clazz =Class.forName("Hospital00007"); //创建字节码对象(参数:类的全限定名)
Hospital00007 hospital =(Hospital00007) clazz.newInstance(); //创建实例对象
//获取方法
Method[] methods =clazz.getDeclaredMethods(); //暴力反射获取所有的方法
for (Method m :methods){
m.setAccessible(true); //设置方法的权限设置为可见可操作
System.out.println(m.getName()); //获取方法名
}
/**
* invoke 参数为(Hospital的实例对象, run方法中的参数值)
*/
methods[0].invoke(hospital,"苏州九龙医院",899); //执行Hospital类中的run方法
}