`
gdwrx_winson
  • 浏览: 131519 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

利用java反射调用类的的私有方法

    博客分类:
  • Java
阅读更多
利用java反射调用类的的私有方法 今天和一位朋友谈到父类私有方法的调用问题,本来以为利用反射很轻松就可以实现,因为在反射看来根本不区分是否是private的,没有想到调用本身的私有方法是可以的,但是调用父类的私有方法则不行,后来纠其原因很有可能是因为getDeclaredMethod方法和getMethod方法并不会查找父类的私有方法,于是只好自己写递归了,经过尝试果然如此。把代码放出来方便更多人。这段代码可以解决很多实际问题,不过利用反射来做的话性能不会太好。 view plaincopy to clipboardprint? 1. package com.syj.util.reflect; 2. 3. import java.lang.reflect.Method; 4. 5. /** 6. *

7. * Title: 私有方法调用工具类 8. *

9. * 10. *

11. * Description:利用java反射调用类的的私有方法 12. *

13. * 14. *

15. * Copyright: Copyright (c) 2007 16. *

17. * 18. * @author 孙钰佳 19. * @main sunyujia@yahoo.cn 20. * @date Jun 1, 2008 10:18:58 PM 21. */ 22. public class PrivateUtil { 23. /** 24. * 利用递归找一个类的指定方法,如果找不到,去父亲里面找直到最上层Object对象为止。 25. * 26. * @param clazz 27. * 目标类 28. * @param methodName 29. * 方法名 30. * @param classes 31. * 方法参数类型数组 32. * @return 方法对象 33. * @throws Exception 34. */ 35. public static Method getMethod(Class clazz, String methodName, 36. final Class[] classes) throws Exception { 37. Method method = null; 38. try { 39. method = clazz.getDeclaredMethod(methodName, classes); 40. } catch (NoSuchMethodException e) { 41. try { 42. method = clazz.getMethod(methodName, classes); 43. } catch (NoSuchMethodException ex) { 44. if (clazz.getSuperclass() == null) { 45. return method; 46. } else { 47. method = getMethod(clazz.getSuperclass(), methodName, 48. classes); 49. } 50. } 51. } 52. return method; 53. } 54. 55. /** 56. * 57. * @param obj 58. * 调整方法的对象 59. * @param methodName 60. * 方法名 61. * @param classes 62. * 参数类型数组 63. * @param objects 64. * 参数数组 65. * @return 方法的返回值 66. */ 67. public static Object invoke(final Object obj, final String methodName, 68. final Class[] classes, final Object[] objects) { 69. try { 70. Method method = getMethod(obj.getClass(), methodName, classes); 71. method.setAccessible(true);// 调用private方法的关键一句话 72. return method.invoke(obj, objects); 73. } catch (Exception e) { 74. throw new RuntimeException(e); 75. } 76. } 77. 78. public static Object invoke(final Object obj, final String methodName, 79. final Class[] classes) { 80. return invoke(obj, methodName, classes, new Object[] {}); 81. } 82. 83. public static Object invoke(final Object obj, final String methodName) { 84. return invoke(obj, methodName, new Class[] {}, new Object[] {}); 85. } 86. 87. /** 88. * 测试反射调用 89. * 90. * @param args 91. */ 92. public static void main(String[] args) { 93. PrivateUtil.invoke(new B(), "printlnA", new Class[] { String.class }, 94. new Object[] { "test" }); 95. PrivateUtil.invoke(new B(), "printlnB"); 96. } 97. } 98. 99. class A { 100. private void printlnA(String s) { 101. System.out.println(s); 102. } 103. } 104. 105. class B extends A { 106. private void printlnB() { 107. System.out.println("b"); 108. } 109. } 程序的输出结果为 test b 说明private方法调用成功了不管是自己的私有方法还是父类的私有方法。
分享到:
评论
2 楼 gdwrx_winson 2011-03-07  
目前我这里的东西比较杂乱,还没有进行系统的归类和整理,多多包涵
chenhailong 写道
如果这也可以的话,我想没人可以看懂得。。。。

1 楼 chenhailong 2011-01-28  
如果这也可以的话,我想没人可以看懂得。。。。

相关推荐

    java 反射 调用私有方法(有参数私有方法)获取私有属性值

    总结起来,Java反射为我们提供了在运行时操作类、方法和属性的强大工具,包括调用私有方法和获取私有属性值。然而,它也是一把双刃剑,使用时需权衡利弊,确保代码的稳定性和安全性。在处理私有成员时,务必注意对...

    Java方法反射调用demo

    Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性使得Java具有了高度的灵活性,常用于框架开发、插件系统、元编程等...

    java * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class

    提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,java * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,java * 反射工具类. 提供调用getter/...

    Java反射调用方法

    在给定的代码中,`TestRef` 类展示了如何使用Java反射调用方法。首先,我们创建了一个 `Foo` 类,它有一个私有字符串成员变量 `msg` 和三个方法:`setMsg`、`getMsg` 和 `outInfo`。`main` 方法是演示反射调用的入口...

    java反射机制,调用私有方法

    Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查和操作类、接口、字段和方法的信息。这种动态类型的能力使得Java代码能够处理未知或未提前定义的对象,增强了程序的灵活性和可扩展性。在Java中...

    利用java反射机制调用类的私有方法(推荐)

    通常,只有在确实有需求且无其他更好解决方案时,才会考虑使用反射调用私有方法。 总结来说,Java反射机制提供了调用私有方法的能力,这主要通过`java.lang.reflect.Method`类实现。虽然这种能力强大,但过度使用...

    Java 反射详解(包含私有方法属性的调用)

    Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性使得Java程序具有了高度的灵活性和动态性,尤其在框架开发、插件系统...

    Java反射机制,通过对象访问调用类的私有成员或方法

    要调用私有方法,我们需要使用`Method`类,先获取到该方法的`Method`对象,然后通过`setAccessible(true)`将其访问权限设为可访问,最后通过`invoke()`方法调用: ```java Method privateMethod = personClass....

    java 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class

    提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数.反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实...

    Java反射访问私有变量和私有方法.doc

    Java 反射访问私有变量和私有方法 Java 反射机制是 Java 语言中的一种强大的工具,使得我们可以在运行时装配代码,而无需在对象之间进行源代码链接,从而使代码更具灵活性。在实际测试中,我们经常需要访问类的非...

    JAVA反射机制的入门代码

    这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法以及访问未导出的类等方面显得尤为有用。以下是对"JAVA反射机制的入门代码"的详细解释。 首先,我们要理解反射的基本概念...

    frida反射调用对象中的方法与字段.pdf

    本文主要讲解了在遇到需要操作Java对象的参数或返回值时,如何利用Frida这一动态代码插桩工具来进行反射调用,包括调用对象的方法和获取对象的字段。Frida是一个强大的动态代码插桩工具,它可以注入到几乎所有的进程...

    通过反射调用静态方法

    在Java编程中,反射是一种强大的工具,它允许我们在运行时检查和操作类、接口、字段以及方法等...这些文件都是Java开发中的常见元素,与反射调用静态方法的主题直接关联性不大,但它们构成了一个完整的Java项目环境。

    JUnit4利用反射机制测试类的私有成员

    7. 调用私有方法,传递参数并捕获结果。例如,`setMethod.invoke(child, new Integer(10))` 8. 验证结果,检查是否符合预期。可以使用断言库,如JUnit提供的`assertThat()`。 请注意,尽管反射可以让我们访问私有...

    反射,动态加载指定类调用类中的方法

    反射机制使得我们能够在运行时动态地获取类的信息,并且能够创建对象、调用方法、访问字段,甚至改变类的行为。在Java中,`java.lang.reflect`包提供了对反射的支持。 在“反射,动态加载指定类调用类中的方法”这...

    Java反射方法调用

    在这个主题中,我们将深入探讨如何使用Java反射来调用不同类型的参数方法,包括无参方法、Object类型参数的方法、基本类型参数的方法以及数组参数的方法,以及如何调用私有方法。 首先,要调用无参方法,我们可以...

    java 反射得到某个方法

    总结一下,Java反射机制为我们提供了在运行时检查和操作类、方法的能力。通过`Class.forName()`获取Class对象,再利用`getMethod()`获取方法,最后使用`invoke()`执行方法。在实际开发中,理解并谨慎使用反射,能够...

    java反射调用实例代码

    这个资源“java反射调用实例代码”提供了关于如何使用Java反射API进行各种操作的实际示例。 在Java中,`java.lang.reflect`包提供了对反射的支持,包括`Class`类,`Constructor`类,`Method`类和`Field`类。这些类...

    Java反射机制修改私有成员变量的实现_Reflection

    在Java中,反射机制主要用于以下几种情况:动态加载类、访问私有成员、运行时检查类型以及调用私有方法等。 标题“Java反射机制修改私有成员变量的实现_Reflection”着重讲述了如何利用反射来修改私有成员变量的值...

Global site tag (gtag.js) - Google Analytics