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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

今天和一位朋友谈到父类私有方法的调用问题,本来以为利用反射很轻松就可以实现,因为在反射看来根本不区分是否是pr ivate的,没有想到调用本身的私有方法是可以的,但是调用父类的私有方法则不行,后来纠其原因很有可能是因为getDeclared Method方法和getMethod方法并不会查找父类的私有方法,于是只好自己写递归了,经过尝试果然如此。把代码放出来方便更多人。这段代码可以解决很多实际问题,不过利用反射来做的话性能不会太好。

view plaincopy to clipboardprint?

1.package com.syj.util.reflect;

2.

3.import ng.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@

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方法调用成功了不管是自己的私有方法还是父类的私有方法。

相关文档
最新文档