写一个关于反射调用私有方法的例子
反射看来根本不区分是否是private的,没有想到调用本身的私有方法是可以的,但是调用父类的私有方法则不行,后来纠其原因很有可能是因为getDeclaredMethod方法和getMethod方法并不会查找父类的私有方法,于是只好自己写递归了,经过尝试果然如此。
public class PrivateUtils {
public Method findMethod(Class clazz, String methodName, Class[] classes) {
Method method = null;
try {
method = clazz.getDeclaredMethod(methodName, classes);
} catch (Exception e) {
try {
method = clazz.getMethod(methodName, classes);
} catch (Exception e2) {
if (clazz.getSuperclass() != null) {
method = findMethod(clazz.getSuperclass(), methodName, classes);
}
}
}
return method;
}
public Object invoke(Class clazz,String methodName,Class[] classes,Object[] args){
Method method=findMethod(clazz, methodName, classes);
if(method!=null){
method.setAccessible(true);
try {
return method.invoke(clazz.newInstance(), args);
} catch (Exception e) {
// TODO: handle exception
}
}
return null;
}
public Object invoke(Class clazz,String methodName,Class[] classes){
return invoke(clazz,methodName,classes,new Object[]{});
}
public Object invoke(Class clazz,String methodName){
return invoke(clazz,methodName,new Class[]{},new Object[]{});
}
public static void main(String[] args) {
PrivateUtils utils=new PrivateUtils();
utils.invoke(MySubClass.class,"printSuperClass",new Class[]{String.class},new Object[]{"fck"});
utils.invoke(MySubClass.class,"printSubClass");
}
}
public class MySubClass extends MySuperClass {
private void printSubClass(){
System.out.println("subClass is on ");
}
}
public class MySuperClass {
private void printSuperClass(String s){
System.out.println("print the super class:"+s);
}
}
浙公网安备 33010602011771号