java反射经典实例

    1. publicObjectgetProperty(Objectowner,StringfieldName)throwsException{
    2. ClassownerClass=owner.getClass();
    3. Fieldfield=ownerClass.getField(fieldname);
    4. Objectproperty=field.get(owner);
    5. returnproperty;
    6. }
    1. publicObjectgetStaticProperty(StringclassName,StringfieldName)
    2. throwsException{
    3. ClassownerClass=Class.forName(className);
    4. Fieldfield=ownerClass.getField(fieldName);
    5. Objectproperty=field.get(ownerClass);
    6. returnproperty;
    7. }
    1. publicObjectinvokeMethod(Objectowner,StringmethodName,Object[]args)throwsException{
    2. ClassownerClass=owner.getClass();
    3. Class[]argsClass=newClass[args.length];
    4. for(inti=0,j=args.length;i<j;i++){
    5. argsClass[i]=args[i].getClass();
    6. }
    7. Methodmethod=ownerClass.getMethod(methodName,argsClass);
    8. returnmethod.invoke(owner,args);
    9. }
    1. publicObjectinvokeStaticMethod(StringclassName,StringmethodName,
    2. Object[]args)throwsException{
    3. ClassownerClass=Class.forName(className);
    4. Class[]argsClass=newClass[args.length];
    5. for(inti=0,j=args.length;i<j;i++){
    6. argsClass[i]=args[i].getClass();
    7. }
    8. Methodmethod=ownerClass.getMethod(methodName,argsClass);
    9. returnmethod.invoke(null,args);
    10. }
    1. publicObjectnewInstance(StringclassName,Object[]args)throwsException{
    2. ClassnewoneClass=Class.forName(className);
    3. Class[]argsClass=newClass[args.length];
    4. for(inti=0,j=args.length;i<j;i++){
    5. argsClass[i]=args[i].getClass();
    6. }
    7. Constructorcons=newoneClass.getConstructor(argsClass);
    8. returncons.newInstance(args);
    9. }
    1. publicbooleanisInstance(Objectobj,Classcls){
    2. returncls.isInstance(obj);
    3. }
    1. publicObjectgetByArray(Objectarray,intindex){
    2. returnArray.get(array,index);
    3. }
    1. importjava.lang.reflect.Array;
    2. importjava.lang.reflect.Constructor;
    3. importjava.lang.reflect.Field;
    4. importjava.lang.reflect.Method;
    5. /**
    6. *JavaReflectionCookbook
    7. *
    8. *@authorMichaelLee
    9. *@since2006-8-23
    10. *@version0.1a
    11. */
    12. publicclassReflection{
    13. /**
    14. *得到某个对象的公共属性
    15. *
    16. *@paramowner,fieldName
    17. *@return该属性对象
    18. *@throwsException
    19. *
    20. */
    21. publicObjectgetProperty(Objectowner,StringfieldName)throwsException{
    22. ClassownerClass=owner.getClass();
    23. Fieldfield=ownerClass.getField(fieldName);
    24. Objectproperty=field.get(owner);
    25. returnproperty;
    26. }
    27. /**
    28. *得到某类的静态公共属性
    29. *
    30. *@paramclassName类名
    31. *@paramfieldName属性名
    32. *@return该属性对象
    33. *@throwsException
    34. */
    35. publicObjectgetStaticProperty(StringclassName,StringfieldName)
    36. throwsException{
    37. ClassownerClass=Class.forName(className);
    38. Fieldfield=ownerClass.getField(fieldName);
    39. Objectproperty=field.get(ownerClass);
    40. returnproperty;
    41. }
    42. /**
    43. *执行某对象方法
    44. *
    45. *@paramowner
    46. *对象
    47. *@parammethodName
    48. *方法名
    49. *@paramargs
    50. *参数
    51. *@return方法返回值
    52. *@throwsException
    53. */
    54. publicObjectinvokeMethod(Objectowner,StringmethodName,Object[]args)
    55. throwsException{
    56. ClassownerClass=owner.getClass();
    57. Class[]argsClass=newClass[args.length];
    58. for(inti=0,j=args.length;i<j;i++){
    59. argsClass[i]=args[i].getClass();
    60. }
    61. Methodmethod=ownerClass.getMethod(methodName,argsClass);
    62. returnmethod.invoke(owner,args);
    63. }
    64. /**
    65. *执行某类的静态方法
    66. *
    67. *@paramclassName
    68. *类名
    69. *@parammethodName
    70. *方法名
    71. *@paramargs
    72. *参数数组
    73. *@return执行方法返回的结果
    74. *@throwsException
    75. */
    76. publicObjectinvokeStaticMethod(StringclassName,StringmethodName,
    77. Object[]args)throwsException{
    78. ClassownerClass=Class.forName(className);
    79. Class[]argsClass=newClass[args.length];
    80. for(inti=0,j=args.length;i<j;i++){
    81. argsClass[i]=args[i].getClass();
    82. }
    83. Methodmethod=ownerClass.getMethod(methodName,argsClass);
    84. returnmethod.invoke(null,args);
    85. }
    86. /**
    87. *新建实例
    88. *
    89. *@paramclassName
    90. *类名
    91. *@paramargs
    92. *构造函数的参数
    93. *@return新建的实例
    94. *@throwsException
    95. */
    96. publicObjectnewInstance(StringclassName,Object[]args)throwsException{
    97. ClassnewoneClass=Class.forName(className);
    98. Class[]argsClass=newClass[args.length];
    99. for(inti=0,j=args.length;i<j;i++){
    100. argsClass[i]=args[i].getClass();
    101. }
    102. Constructorcons=newoneClass.getConstructor(argsClass);
    103. returncons.newInstance(args);
    104. }
    105. /**
    106. *是不是某个类的实例
    107. *@paramobj实例
    108. *@paramcls
    109. *@return如果obj是此类的实例,则返回true
    110. */
    111. publicbooleanisInstance(Objectobj,Classcls){
    112. returncls.isInstance(obj);
    113. }
    114. /**
    115. *得到数组中的某个元素
    116. *@paramarray数组
    117. *@paramindex索引
    118. *@return返回指定数组对象中索引组件的值
    119. */
    120. publicObjectgetByArray(Objectarray,intindex){
    121. returnArray.get(array,index);
    122. }
    123. }

    Java提供了一套机制来动态执行方法和构造方法,以及数组操作等,这套机制就叫——反射。反射机制是如今很多流行框架的实现基础,其中包括Spring、Hibernate等。原理性的问题不是本文的重点,接下来让我们在实例中学习这套精彩的机制。

    1. 得到某个对象的属性

    Class ownerClass = owner.getClass():得到该对象的Class。

    Field field = ownerClass.getField(fieldName):通过Class得到类声明的属性。

    Object property = field.get(owner):通过对象得到该属性的实例,如果这个属性是非公有的,这里会报IllegalAccessException。

    2. 得到某个类的静态属性

    Class ownerClass = Class.forName(className) :首先得到这个类的Class。

    Field field = ownerClass.getField(fieldName):和上面一样,通过Class得到类声明的属性。

    Object property = field.get(ownerClass) :这里和上面有些不同,因为该属性是静态的,所以直接从类的Class里取。

    3. 执行某对象的方法

    Class owner_class = owner.getClass() :首先还是必须得到这个对象的Class。

    3~6行:配置参数的Class数组,作为寻找Method的条件。

    Method method = ownerClass.getMethod(methodName, argsClass):通过Method名和参数的Class数组得到要执行的Method。

    method.invoke(owner, args):执行该Method,invoke方法的参数是执行这个方法的对象,和参数数组。返回值是Object,也既是该方法的返回值。

    4. 执行某个类的静态方法

    基本的原理和实例3相同,不同点是最后一行,invoke的一个参数是null,因为这是静态方法,不需要借助实例运行。

    5. 新建实例

    这里说的方法是执行带参数的构造函数来新建实例的方法。如果不需要参数,可以直接使用newoneClass.newInstance()来实现。

    Class newoneClass = Class.forName(className):第一步,得到要构造的实例的Class。

    第6~第10行:得到参数的Class数组。

    Constructor cons = newoneClass.getConstructor(argsClass):得到构造子。

    cons.newInstance(args):新建实例。

    6. 判断是否为某个类的实例

    7. 得到数组中的某个元素

    附完整源码:

你可能感兴趣的:(java反射)