用反射的方式获取父类中的所有属性和方法

摘要:
=Object.class;clazz=clazz.getSuperclass()){try{method=clazz.getDeclaredMethod;returnmethod;}catch{//这里甚么都不能抛出去。//如果这里的异常打印或者往外抛,则就不会进入}}returnnull;}/***直接调用对象方法,而忽略修饰符*@paramobject:子类对象*@parammethodName:父类中的方法名*@paramparameterTypes:父类中的方法参数类型*@paramparameters:父类中的方法参数*@return父类中方法的执行结果*/publicstaticObjectinvokeMethod(Objectobject,StringmethodName,Class[]parameterTypes,Object[]parameters){//根据对象、方法名和对应的方法参数通过取Method对象Methodmethod=getDeclaredMethod;//抑制Java对方法进行检查,主要是针对私有方法而言method.setAccessible;try{if(null!=method){//调用object的method所代表的方法,其方法的参数是parametersreturnmethod.invoke;}}catch{e.printStackTrace();}catch{e.printStackTrace();}catch{e.printStackTrace();}returnnull;}/***循环向上转型,获*@paramobject:子类对象*@paramfieldName:父类中*@return父类中*/publicstaticFieldgetDeclaredField{Fieldfield=null;Class˂?
Java代码收藏代码
  1. packagecom.syh.jdbc.reflection_super;
  2. /**
  3. *父类
  4. *@authorsyh
  5. *
  6. */
  7. publicclassParent{
  8. publicStringpublicField="1";
  9. StringdefaultField="2";
  10. protectedStringprotectedField="3";
  11. privateStringprivateField="4";
  12. publicvoidpublicMethod(){
  13. System.out.println("publicMethod...");
  14. }
  15. voiddefaultMethod(){
  16. System.out.println("defaultMethod...");
  17. }
  18. protectedvoidprotectedMethod(){
  19. System.out.println("protectedMethod...");
  20. }
  21. privatevoidprivateMethod(){
  22. System.out.println("privateMethod...");
  23. }
  24. }

Java代码收藏代码
  1. packagecom.syh.jdbc.reflection_super;
  2. /**
  3. *子类
  4. *@authorsyh
  5. *
  6. */
  7. publicclassSonextendsParent{
  8. }

Java代码收藏代码
  1. packagecom.syh.jdbc.reflection_super;
  2. importjava.lang.reflect.Field;
  3. importjava.lang.reflect.InvocationTargetException;
  4. importjava.lang.reflect.Method;
  5. /**
  6. *方法类
  7. *@authorsyh
  8. *
  9. */
  10. publicclassReflectionUtils{
  11. /**
  12. *循环向上转型,获*@paramobject:子类对象
  13. *@parammethodName:父类中的方法名
  14. *@paramparameterTypes:父类中的方法参数类型
  15. *@return父类中的方法对象
  16. */
  17. publicstaticMethodgetDeclaredMethod(Objectobject,StringmethodName,Class<?>...parameterTypes){
  18. Methodmethod=null;
  19. for(Class<?>clazz=object.getClass();clazz!=Object.class;clazz=clazz.getSuperclass()){
  20. try{
  21. method=clazz.getDeclaredMethod(methodName,parameterTypes);
  22. returnmethod;
  23. }catch(Exceptione){
  24. //这里甚么都能抛出去。
  25. //如果这里的异常打印或者往外抛,则就会进入
  26. }
  27. }
  28. returnnull;
  29. }
  30. /**
  31. *直接调用对象方法,而忽略修饰符(private,protected,default)
  32. *@paramobject:子类对象
  33. *@parammethodName:父类中的方法名
  34. *@paramparameterTypes:父类中的方法参数类型
  35. *@paramparameters:父类中的方法参数
  36. *@return父类中方法的执行结果
  37. */
  38. publicstaticObjectinvokeMethod(Objectobject,StringmethodName,Class<?>[]parameterTypes,
  39. Object[]parameters){
  40. //根据对象、方法名和对应的方法参数通过Method对象
  41. Methodmethod=getDeclaredMethod(object,methodName,parameterTypes);
  42. //抑制Java对方法进行检查,主要是针对私有方法而言
  43. method.setAccessible(true);
  44. try{
  45. if(null!=method){
  46. //调用object的method所代表的方法,其方法的参数是parameters
  47. returnmethod.invoke(object,parameters);
  48. }
  49. }catch(IllegalArgumentExceptione){
  50. e.printStackTrace();
  51. }catch(IllegalAccessExceptione){
  52. e.printStackTrace();
  53. }catch(InvocationTargetExceptione){
  54. e.printStackTrace();
  55. }
  56. returnnull;
  57. }
  58. /**
  59. *循环向上转型,获*@paramobject:子类对象
  60. *@paramfieldName:父类中*@return父类中*/
  61. publicstaticFieldgetDeclaredField(Objectobject,StringfieldName){
  62. Fieldfield=null;
  63. Class<?>clazz=object.getClass();
  64. for(;clazz!=Object.class;clazz=clazz.getSuperclass()){
  65. try{
  66. field=clazz.getDeclaredField(fieldName);
  67. returnfield;
  68. }catch(Exceptione){
  69. //这里甚么都能抛出去。
  70. //如果这里的异常打印或者往外抛,则就会进入
  71. }
  72. }
  73. returnnull;
  74. }
  75. /**
  76. *直接设置对象属性值,忽略private/protected修饰符,也*@paramobject:子类对象
  77. *@paramfieldName:父类中*@paramvalue:将要设置的值
  78. */
  79. publicstaticvoidsetFieldValue(Objectobject,StringfieldName,Objectvalue){
  80. //根据对象和属性名通过Field对象
  81. Fieldfield=getDeclaredField(object,fieldName);
  82. //抑制Java对其的检查
  83. field.setAccessible(true);
  84. try{
  85. //将object中field所代表的值设置为value
  86. field.set(object,value);
  87. }catch(IllegalArgumentExceptione){
  88. e.printStackTrace();
  89. }catch(IllegalAccessExceptione){
  90. e.printStackTrace();
  91. }
  92. }
  93. /**
  94. *直接读的属性值,忽略private/protected修饰符,也*@paramobject:子类对象
  95. *@paramfieldName:父类中*@return:父类中*/
  96. publicstaticObjectgetFieldValue(Objectobject,StringfieldName){
  97. //根据对象和属性名通过Field对象
  98. Fieldfield=getDeclaredField(object,fieldName);
  99. //抑制Java对其的检查
  100. field.setAccessible(true);
  101. try{
  102. //获的属性
  103. returnfield.get(object);
  104. }catch(Exceptione){
  105. e.printStackTrace();
  106. }
  107. returnnull;
  108. }
  109. }

Java代码收藏代码
  1. packagecom.syh.jdbc.reflection_super;
  2. importstaticorg.junit.Assert.*;
  3. importjava.lang.reflect.Field;
  4. importjava.lang.reflect.Method;
  5. importorg.junit.Test;
  6. /**
  7. *测试类,用JUnit4进行测试
  8. *@authorsyh
  9. *
  10. */
  11. publicclassReflectionUtilsTest{
  12. /**
  13. *测试获父类的各个方法对象
  14. */
  15. @Test
  16. publicvoidtestGetDeclaredMethod(){
  17. Objectobj=newSon();
  18. //获MethodpublicMethod=ReflectionUtils.getDeclaredMethod(obj,"publicMethod");
  19. System.out.println(publicMethod.getName());
  20. //获MethoddefaultMethod=ReflectionUtils.getDeclaredMethod(obj,"defaultMethod");
  21. System.out.println(defaultMethod.getName());
  22. //获MethodprotectedMethod=ReflectionUtils.getDeclaredMethod(obj,"protectedMethod");
  23. System.out.println(protectedMethod.getName());
  24. //获MethodprivateMethod=ReflectionUtils.getDeclaredMethod(obj,"privateMethod");
  25. System.out.println(privateMethod.getName());
  26. }
  27. /**
  28. *测试调用*@throwsException
  29. */
  30. @Test
  31. publicvoidtestInvokeMethod()throwsException{
  32. Objectobj=newSon();
  33. //调用ReflectionUtils.invokeMethod(obj,"publicMethod",null,null);
  34. //调用ReflectionUtils.invokeMethod(obj,"defaultMethod",null,null);
  35. //调用ReflectionUtils.invokeMethod(obj,"protectedMethod",null,null);
  36. //调用ReflectionUtils.invokeMethod(obj,"privateMethod",null,null);
  37. }
  38. /**
  39. *测试获父类的各个属性名
  40. */
  41. @Test
  42. publicvoidtestGetDeclaredField(){
  43. Objectobj=newSon();
  44. //获FieldpublicField=ReflectionUtils.getDeclaredField(obj,"publicField");
  45. System.out.println(publicField.getName());
  46. //获FielddefaultField=ReflectionUtils.getDeclaredField(obj,"defaultField");
  47. System.out.println(defaultField.getName());
  48. //获FieldprotectedField=ReflectionUtils.getDeclaredField(obj,"protectedField");
  49. System.out.println(protectedField.getName());
  50. //获FieldprivateField=ReflectionUtils.getDeclaredField(obj,"privateField");
  51. System.out.println(privateField.getName());
  52. }
  53. @Test
  54. publicvoidtestSetFieldValue(){
  55. Objectobj=newSon();
  56. System.out.println("原来的各个属性的值:");
  57. System.out.println("publicField="+ReflectionUtils.getFieldValue(obj,"publicField"));
  58. System.out.println("defaultField="+ReflectionUtils.getFieldValue(obj,"defaultField"));
  59. System.out.println("protectedField="+ReflectionUtils.getFieldValue(obj,"protectedField"));
  60. System.out.println("privateField="+ReflectionUtils.getFieldValue(obj,"privateField"));
  61. ReflectionUtils.setFieldValue(obj,"publicField","a");
  62. ReflectionUtils.setFieldValue(obj,"defaultField","b");
  63. ReflectionUtils.setFieldValue(obj,"protectedField","c");
  64. ReflectionUtils.setFieldValue(obj,"privateField","d");
  65. System.out.println("***********************************************************");
  66. System.out.println("将属性值改变后的各个属性值:");
  67. System.out.println("publicField="+ReflectionUtils.getFieldValue(obj,"publicField"));
  68. System.out.println("defaultField="+ReflectionUtils.getFieldValue(obj,"defaultField"));
  69. System.out.println("protectedField="+ReflectionUtils.getFieldValue(obj,"protectedField"));
  70. System.out.println("privateField="+ReflectionUtils.getFieldValue(obj,"privateField"));
  71. }
  72. @Test
  73. publicvoidtestGetFieldValue(){
  74. Objectobj=newSon();
  75. System.out.println("publicField="+ReflectionUtils.getFieldValue(obj,"publicField"));
  76. System.out.println("defaultField="+ReflectionUtils.getFieldValue(obj,"defaultField"));
  77. System.out.println("protectedField="+ReflectionUtils.getFieldValue(obj,"protectedField"));
  78. System.out.println("privateField="+ReflectionUtils.getFieldValue(obj,"privateField"));
  79. }
  80. }

免责声明:文章转载自《用反射的方式获取父类中的所有属性和方法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇自定义popupwindowDruid 集群方式部署 —— 启动服务下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ES6中的类和对象

1.类class 类抽象了对象的公共部分,它泛指某一大类, 对象特指某一个,通过类实例化一个具体的对象 面对对象的思维特点:       1.抽取(抽象)对象共用的属性和行为组织(封装)成一个类(模板)       2.对类进行实例化,获取类的对象 2.类的继承   程序中的继承:子类可以继承父类的属性和方法;       语法:        class...

Java中类加载过程和对象创建过程

类加载过程: 1, JVM会先去方法区中找有没有相应类的.class存在。如果有,就直接使用;如果没有,则把相关类的.class加载到方法区 2, 在.class加载到方法区时,会分为两部分加载:先加载非静态内容,再加载静态内容 3, 加载非静态内容:把.class中的所有非静态内容加载到方法区下的非静态区域内 4, 加载静态内容:     4.1、把.c...

【转】C++中了类继承和调用父类的构造函数方法

构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法)。因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统需要调用其父类的构造方法。     如果没有显式的构造函数,编译器会给一个默认的构造函数,并且该默认的构造函数仅仅在没有显式地声明构造函数情况下创建。 构造原则...

第八章 Python 对象和类

一、什么是对象 在 Pyth 中,对象就是经过实例化的,具体可以操作的一组代码的组合; 对象一般包含数据(变量,更习惯称之为属性 attribute),也包含代码(函数,也称之为方法) 当你想要创建一个别人从来都没有创建过的新对象时,首先必须定义一个类,用以指明该类型的对象所包含的内容(属性和方法) 可以把对象想象成 名词 ,那么方法就是动词。对象代表着一...

Java基础(三十四)String、StringBuffer类和数据缓冲区Buffer类

  一、String类   1.创建字符串对象   创建字符串对象有两种方法:直接用“=”或者使用“new String(...)” String aStr = "TMZ"; String bStr = new String("TMZ"); String nullStr = "";...

Eclipse中的TreeViewer类和ListViewer类

TreeViewer和TableViewer在使用上还是有很多相似之处.TreeViewer中冶有TableViewer中的过滤器和排序器.具体使用看TableViewer中的使用. 和Table有JFace的扩展TableViewer一样,Tree也有一个JFace中的扩展,那就是TreeViewer.因为TreeViewer和TableViewer继承...