Java通过反射调用一个类的私有方法

获得私有方法的流程是

(1)获取目标类

(2)获取目标方法

Method method=clazz.getDeclaredMethod(name);//可以调用类中的所有方法(不包括父类中继承的方法)

Method method=clazz.getMethod(name);//可以调用类中有访问权限的方法(包括父类中继承的方法)

(3)method.toGenericString()或method.toString()方法来输出方法的字符串形式

toGenericString()
返回描述此 Method 的字符串,包括类型参数。

toString()
返回描述此 Method 的字符串。

目前没有弄清这两种方法的具体区别,测试的方法中输出的结果一样,以后弄清区别再来更改。

(4)使用invoke()方法调用方法

package test0210;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class test1 {
//类的私有方法
private String testMethod(int num){
return “输入的数字为:”+num;
}

public static void main(String[] args) {
try {
Class clazz = Class.forName(“test0210.test1”);
Method method = clazz.getDeclaredMethod(“testMethod”, int.class);
//打印完整地方法表示字符串
System.out.println(method.toGenericString());
//调用方法
Object obj = method.invoke(clazz.newInstance(), 2);
System.out.println(obj);

} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}

上面的代码将测试和私有方法放在了一起,没有出现异常。

下面的代码将测试和方法分开在两个类中,运行后会出现 java.lang.IllegalAccessException异常

package test0210;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class test2 {
public static void main(String[] args) {
try {

Class<?> clazz = Class.forName(“test0210.test1”);
Method method = clazz.getDeclaredMethod(“testMethod”, int.class);

System.out.println(method.toGenericString());

Object obj = method.invoke(clazz.newInstance(), 2);
System.out.println(obj);

} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}

查询资料说明该异常是在反射中调用了private修饰的方法。咦,反射不是可以得到私有的方法,为什么这里不能,没办法继续上网查资料。。。

最后搞明白了是缺少setAccessible(true)方法,使用继承父类(AccessibleObject类)来的setAccessible()方法,来设置或取消访问检查,以达到访问私有对象的目的。

Class<?> clazz = Class.forName(“test0210.test1”);
Method method = clazz.getDeclaredMethod(“testMethod”, int.class);
method.setAccessible(true);

System.out.println(method.toGenericString());

 

欢迎使用66资源网
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
7. 本站有不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别!

66源码网 » Java通过反射调用一个类的私有方法

提供最优质的资源集合

立即查看 了解详情