利用JAVA反射机制实现调用私有方法

这两天研究如何利用程序挂断电话。发现在Android1.0的时候Phone中提供了提供了endCall方法,而1.5以后这个方法被设置为私有了。

如此有了如下研究:

 /**
  * 利用JAVA反射机制调用ITelephony的endCall()结束通话。
  */
 private void endCall() {
  // 初始化iTelephony
  Class<TelephonyManager> c = TelephonyManager.class;
  Method getITelephonyMethod = null;
  try {
   // 获取所有public/private/protected/默认
   // 方法的函数,如果只需要获取public方法,则可以调用getMethod.
   getITelephonyMethod = c.getDeclaredMethod("getITelephony",
     (Class[]) null);
   // 将要执行的方法对象设置是否进行访问检查,也就是说对于public/private/protected/默认
   // 我们是否能够访问。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false
   // 则指示反射的对象应该实施 Java 语言访问检查。
   getITelephonyMethod.setAccessible(true);
  } catch (SecurityException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (NoSuchMethodException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

  try {
   ITelephony iTelephony = (ITelephony) getITelephonyMethod.invoke(
     tManager, (Object[]) null);
   try {
    iTelephony.endCall();
   } catch (RemoteException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  } catch (IllegalArgumentException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IllegalAccessException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (InvocationTargetException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }

 

 

 

/******************************************************************************************/

     以下摘自---百度空间---描述了如何利用反射进行私有方法的单元测试

/******************************************************************************************/

 

利用安全管理器

 

安全性管理器与反射机制相结合,也可以达到我们的目的。Java 运行时依靠一种安全性管理器来检验调用代码对某一特定的访问而言是否有足够的权限。具体来说,安全性管理器是 java.lang.SecurityManager 类或扩展自该类的一个类,且它在运行时检查某些应用程序操作的权限。换句话说,所有的对象访问在执行自身逻辑之前都必须委派给安全管理器,当访问受到安全性管理器的控制,应用程序就只能执行那些由相关安全策略特别准许的操作。因此安全管理器一旦启动可以为代码提供足够的保护。默认情况下,安全性管理器是没有被设置的,除非代码明确地安装一个默认的或定制的安全管理器,否则运行时的访问控制检查并不起作用。我们可以通过这一点在运行时避开 Java 的访问控制检查,达到我们访问非公有成员变量或方法的目的。为能访问我们需要的非公有成员,我们还需要使用 Java 反射技术。Java 反射是一种强大的工具,它使我们可以在运行时装配代码,而无需在对象之间进行源代码链接,从而使代码更具灵活性。在编译时,Java 编译程序保证了私有成员的私有特性,从而一个类的私有方法和私有成员变量不能被其他类静态引用。然而,通过 Java 反射机制使得我们可以在运行时查询以及访问变量和方法。由于反射是动态的,因此编译时的检查就不再起作用了。

下面的代码演示了如何利用安全性管理器与反射机制访问私有变量。


清单 3. 利用反射机制访问类的成员变量

// 获得指定变量的值
public static Object getValue(Object instance, String fieldName)
    
throws    IllegalAccessException, NoSuchFieldException ... {

     Field field
= getField(instance.getClass(), fieldName);
    
// 参数值为true,禁用访问控制检查
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值