使用代理实现对私有方法的访问
来源:互联网 发布:淘宝达人在哪里 编辑:程序博客网 时间:2024/05/17 20:25
public static Object invokePrivateMethod(Object obj, String methodName,
Class[] types, Object[] args) throws Exception {
Object ret = null;
try {
// getMethod() は public のみが対象となるため getDeclaredMethod() を使用します。
Method callee = obj.getClass().getDeclaredMethod(methodName, types);
// Accessible フラグを true とすることで、private, package,
// protected でもアクセスできるようになります。
callee.setAccessible(true);
// 実際にメソッドを呼び出します。
ret = callee.invoke(obj, args);
}
// メソッド内の例外は InvocationTargetException にラップされて送付されます。
catch (InvocationTargetException e) {
if (e.getTargetException() instanceof Exception) {
throw (Exception) e.getTargetException();
}
System.err.println(e.getTargetException().getMessage());
throw e;
}
// それ以外の例外が発生したときは、今回はそのまま例外をスローすることにしています。
// テスト時はコンソールに例外が出力されるので、それを参考にして下さい。
catch (Exception e) {
e.printStackTrace();
throw e;
}
return ret;
}
调用:第一个参数类对象,第二个参数方法名,点三个参数方法参数类型及个数,第四个参数参数值
invokePrivateMethod(logic, "checkTelegramParam", new Class[] { String.class, String.class, String.class, String.class }, new Object[] { shirei, destGwNo, procDate, procTime });
注意第一个参数一定是类的实例,不然出错。
第二种方法将以上方法详细化了:
public static Object invokeMethod(final Object object, final String methodName, final Class<?>[] parameterTypes,
final Object[] parameters) throws Exception {
Method method = getDeclaredMethod(object, methodName, parameterTypes);
if (method == null) {
throw new IllegalArgumentException("Could not find method [" + methodName + "] on target [" + object + "]");
}
method.setAccessible(true);
try {
return method.invoke(object, parameters);
} catch (Exception e) {
throw e;
}
}
/**
*
*/
protected static Method getDeclaredMethod(Object object, String methodName, Class<?>[] parameterTypes) {
for (Class<?> superClass = object.getClass(); superClass != Object.class; superClass = superClass
.getSuperclass()) {
try {
return superClass.getDeclaredMethod(methodName, parameterTypes);
} catch (NoSuchMethodException e) {//NOSONAR
// Field is not in this class,get super class
}
}
return null;
}
第二种方法与第一种方法是一个意思。
- 使用代理实现对私有方法的访问
- 利用java反射机制,实现对类的私有变量和私有方法的访问
- 利用java反射机制,实现对类的私有变量和私有方法的访问
- 利用java反射机制,实现对类的私有变量和私有方法的访问
- C# 反射机制(reflection)实现对私有成员的访问
- 使用Java反射机制实现访问其他类的私有方法
- 使用Java反射机制实现访问其他类的私有方法
- 使用Java反射机制实现访问其他类的私有方法
- 使用反射机制实现对类中私有方法的调用
- 私有成员访问的方法
- 使用Apache的Proxy模块实现对被代理网站的访问
- Java反射的三种实现方式,访问私有方法和私有属性
- 使用 Visual Studio 2005 对私有方法的单元测试
- 使用代理对类的属性赋值或者是抽象类私有类
- 访问私有变量,私有方法
- 反射访问类的私有属性对象的私有方法
- 利用Reflection API访问类的私有成员、私有方法
- iOS访问类的私有成员变量及私有方法
- flash 导出 swc 到flex中用
- 使用busybox制作Linux根文件系统
- YSLOW法则中,为什么yahoo推荐用GET代替POST?
- Linux下常用配置文件及常用命令介绍
- Excel多个工作表(Sheet)合并
- 使用代理实现对私有方法的访问
- flex文件上传1
- Framwork增加资源后更新public.xml 和current.xml
- 如何修改并读取StatusBar的内容
- 借助 C++ 进行 Windows 开发
- Tomcat压力优化
- flex2
- CodeForces 103D
- Struts2 搭建开发环境