歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java中利用反射對類的hidden成員方法和屬性的訪問

Java中利用反射對類的hidden成員方法和屬性的訪問

日期:2017/3/1 10:31:14   编辑:Linux編程

java中通過訪問控制符來控制對類成員的訪問,private 成員表示只在類的內部才可以被訪問,但是利用java的反射機制卻可以再類的外部來訪問類的私有成員

下面是個簡單的例子來說明這一點

  1. package com.eric.reflect;
  2. import java.lang.reflect.Field;
  3. import java.lang.reflect.Method;
  4. /**
  5. *
  6. * this class mainly for explain how to access hidden method or field
  7. *
  8. *
  9. *
  10. * archive $ProjectName: $
  11. *
  12. * @author Admin
  13. *
  14. * @version $Revision: $ $Name: $
  15. */
  16. public class AccesHiddenElements {
  17. public static void main(String[] args) {
  18. Inter inter = new InterImpl();
  19. inter.f();
  20. if (inter instanceof InterImpl) {
  21. // use class cast to method that in InterImpl class
  22. ((InterImpl) inter).g();
  23. // can't access h method
  24. // ((InterImpl) inter).h();
  25. }
  26. // (1)javap -private InterImpl to get all method name eg h()
  27. // (2)use reflect to access private method
  28. accessMehodByName(inter, "h");
  29. accessFieldByName(inter, "name");
  30. Inter annousInter = new Inter() {
  31. public void f() {
  32. System.out.println("f() method in annousInter");
  33. }
  34. private void g() {
  35. System.out.println("g() method in annousInter");
  36. }
  37. };
  38. accessMehodByName(annousInter, "g");
  39. }
  40. static void accessMehodByName(Object obj, String methodName) {
  41. try {
  42. Method method = obj.getClass().getDeclaredMethod(methodName);
  43. method.setAccessible(true);
  44. method.invoke(obj);
  45. } catch (Exception e) {
  46. e.printStackTrace();
  47. }
  48. }
  49. static void accessFieldByName(Object obj, String methodName) {
  50. try {
  51. Field field = obj.getClass().getDeclaredField(methodName);
  52. field.setAccessible(true);
  53. System.out.println(field.getInt(obj));
  54. } catch (Exception e) {
  55. e.printStackTrace();
  56. }
  57. }
  58. }
  59. interface Inter {
  60. public void f();
  61. }
  62. class InterImpl implements Inter {
  63. <pre name="code" class="java"> //私有屬性,正常情況下外部類不可以訪問此方法

private int name = 10;public void f() {System.out.println("f() in InterImpl");}public void g() {System.out.println("g() in InterImpl");} //私有方法,正常情況下外部類不可以訪問此方法private void h() {System.out.println("h() in InterImpl");}}/* * * History: * * * * $Log: $ */

Copyright © Linux教程網 All Rights Reserved