- 浏览: 131519 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
jingjieyiman:
引用
[url][/url][flash=200,200][ ...
Java 学习入门到高深 -
Technoboy:
...
AOP 的利器:ASM 3.0 介绍 -
kingkan:
非常支持,我有意愿加入。。。如果可以,请给我短消息,je我每天 ...
【征集】做一个管理人际关系的应用 -
夜之son:
csuzm0613 写道能否直接做成Android应用程序呢? ...
【征集】做一个管理人际关系的应用 -
gdwrx_winson:
谢谢异常哥的回复,目前的想法是做成一个web应用抛出异常的爱 ...
【征集】做一个管理人际关系的应用
利用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
如果这也可以的话,我想没人可以看懂得。。。。
发表评论
-
【征集】做一个管理人际关系的应用
2011-03-07 21:10 1167背景:目前人际交往越来越密切,但是同时处理好庞大的人际关系又比 ... -
输入输出流的复制
2010-12-30 09:26 664public static void copy(Inpu ... -
RAD快速开发
2010-12-14 12:28 1328RAD=rapid application develop(快 ... -
TreePath的用法
2010-12-14 10:53 1387TreeSelection sel = (TreeSelect ... -
获取数据库中存储过程名
2010-12-14 10:49 857获取数据库中存储过程名 This example retri ... -
数字输入校验
2010-12-14 10:48 7701. txt_TimeLimit = new T ... -
GMF手动增加一个EditPart需要修改代码
2010-12-14 10:19 974edit: 创建相应的command、helper、edi ... -
Collections
2010-12-14 10:16 1101Collections.unmodifiableSet() ... -
Collections
2010-12-14 10:16 1000Collections.unmodifiableSet() ... -
JMX连接JConsole字符串
2010-12-14 10:13 973service:jmx:iiop:///jndi/corban ... -
Problem视图增加Marker
2010-12-14 10:00 1322首先,需要得到Problems视图窗口: IWorkbenc ... -
SQL数据库类型
2010-12-14 09:59 839SQL Server 2000 Data Types SQL ... -
数据库相关知识
2010-12-14 09:22 730String strurl = "jdbc:o ... -
FileOutputStream
2010-12-10 14:00 1293FileOutputStream可以创建文件,但一般使用new ... -
关于端口被占用
2010-11-12 10:49 825今天整了一下JBoss的ESB,Server启动的时候抛了端口 ... -
好的算法
2010-11-11 20:00 758用数组代替Map---填入过程 public v ... -
Java调试参数
2010-09-28 08:48 3094java -Xdebug -Xrunjdwp:tran ... -
SQL语句
2010-09-26 13:31 691下列语句部分是Mssql语句,不可以在access中使用 ... -
使用Java JDK中Java.net包控制UDP协议
2010-09-26 12:38 878使用Java JDK中Java.net包控制UDP协议 什么 ... -
关于动态调用方法的例子
2010-09-26 12:37 717情况: 一个类中有很多同名方法,名字相同,参数列表不一样。 ...
相关推荐
总结起来,Java反射为我们提供了在运行时操作类、方法和属性的强大工具,包括调用私有方法和获取私有属性值。然而,它也是一把双刃剑,使用时需权衡利弊,确保代码的稳定性和安全性。在处理私有成员时,务必注意对...
Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性使得Java具有了高度的灵活性,常用于框架开发、插件系统、元编程等...
提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,java * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class,java * 反射工具类. 提供调用getter/...
在给定的代码中,`TestRef` 类展示了如何使用Java反射调用方法。首先,我们创建了一个 `Foo` 类,它有一个私有字符串成员变量 `msg` 和三个方法:`setMsg`、`getMsg` 和 `outInfo`。`main` 方法是演示反射调用的入口...
Java反射机制是Java编程语言中的一个强大工具,它允许程序在运行时检查和操作类、接口、字段和方法的信息。这种动态类型的能力使得Java代码能够处理未知或未提前定义的对象,增强了程序的灵活性和可扩展性。在Java中...
通常,只有在确实有需求且无其他更好解决方案时,才会考虑使用反射调用私有方法。 总结来说,Java反射机制提供了调用私有方法的能力,这主要通过`java.lang.reflect.Method`类实现。虽然这种能力强大,但过度使用...
Java反射是Java编程语言中的一个强大特性,它允许在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性使得Java程序具有了高度的灵活性和动态性,尤其在框架开发、插件系统...
要调用私有方法,我们需要使用`Method`类,先获取到该方法的`Method`对象,然后通过`setAccessible(true)`将其访问权限设为可访问,最后通过`invoke()`方法调用: ```java Method privateMethod = personClass....
提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数.反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实...
Java 反射访问私有变量和私有方法 Java 反射机制是 Java 语言中的一种强大的工具,使得我们可以在运行时装配代码,而无需在对象之间进行源代码链接,从而使代码更具灵活性。在实际测试中,我们经常需要访问类的非...
这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理元数据、创建对象、调用私有方法以及访问未导出的类等方面显得尤为有用。以下是对"JAVA反射机制的入门代码"的详细解释。 首先,我们要理解反射的基本概念...
本文主要讲解了在遇到需要操作Java对象的参数或返回值时,如何利用Frida这一动态代码插桩工具来进行反射调用,包括调用对象的方法和获取对象的字段。Frida是一个强大的动态代码插桩工具,它可以注入到几乎所有的进程...
在Java编程中,反射是一种强大的工具,它允许我们在运行时检查和操作类、接口、字段以及方法等...这些文件都是Java开发中的常见元素,与反射调用静态方法的主题直接关联性不大,但它们构成了一个完整的Java项目环境。
7. 调用私有方法,传递参数并捕获结果。例如,`setMethod.invoke(child, new Integer(10))` 8. 验证结果,检查是否符合预期。可以使用断言库,如JUnit提供的`assertThat()`。 请注意,尽管反射可以让我们访问私有...
反射机制使得我们能够在运行时动态地获取类的信息,并且能够创建对象、调用方法、访问字段,甚至改变类的行为。在Java中,`java.lang.reflect`包提供了对反射的支持。 在“反射,动态加载指定类调用类中的方法”这...
在这个主题中,我们将深入探讨如何使用Java反射来调用不同类型的参数方法,包括无参方法、Object类型参数的方法、基本类型参数的方法以及数组参数的方法,以及如何调用私有方法。 首先,要调用无参方法,我们可以...
总结一下,Java反射机制为我们提供了在运行时检查和操作类、方法的能力。通过`Class.forName()`获取Class对象,再利用`getMethod()`获取方法,最后使用`invoke()`执行方法。在实际开发中,理解并谨慎使用反射,能够...
这个资源“java反射调用实例代码”提供了关于如何使用Java反射API进行各种操作的实际示例。 在Java中,`java.lang.reflect`包提供了对反射的支持,包括`Class`类,`Constructor`类,`Method`类和`Field`类。这些类...
在Java中,反射机制主要用于以下几种情况:动态加载类、访问私有成员、运行时检查类型以及调用私有方法等。 标题“Java反射机制修改私有成员变量的实现_Reflection”着重讲述了如何利用反射来修改私有成员变量的值...