Java反射技术之暴力反射
java反射技术应用广泛,它能够配置:类的全限定名、方法和参数,完成对象的初始化,甚至是反射某些芳芳。这样就可以大大增强Java的可配置性,Spriong Ioc的基本原理也是如此(当然 Spring Ioc 的代码要复杂的多)。
如果构造方法、普通方法、字段 被private(私有)修饰,默认情况下,在该类的外部是不允许被访问的,如果使用暴力反射,即使被private修饰也可以进行操作。
直接进入正题:如何使用反射技术,来操作私有方法
package reflect;
/**
* @Type Reflect.java
* @Desc
* @author hanchenyi
* @date Apr 8, 2019 11:11:35 AM
* @version
*/
public class Reflect {
private void sayHello(String name) {
System.out.println("你好:"+name);
}
}
测试类
public class Demo {
@SuppressWarnings("deprecation")
public static void main(String[] args) throws Exception {
Class<?> clazz = Class.forName("reflect.Reflect");
// 获取私有方法 sayHello ,注意是否有参数
Method method = clazz.getDeclaredMethod("sayHello",String.class);
System.out.println(method);
Reflect reflect = (Reflect) clazz.newInstance();
// 在私有方法运行之前 先取消Java的权限控制检查
method.setAccessible(true);
method.invoke(reflect,"克瑞斯");
}
}
打印结果
private void reflect.Reflect.sayHello(java.lang.String)
你好:克瑞斯
运行私有方法的时候,别忘了加上参数
例如直接这样
method.invoke(reflect);
就会出现
java.lang.IllegalArgumentException 非法参数异常
TheGreatBillGates