java反射 获取父类中的所有属性和方法工具类

本文详细介绍了Java反射机制的应用,包括如何使用反射获取父类的所有属性和方法,以及如何调用这些方法和修改属性值。通过具体代码示例,展示了反射在获取不同访问级别的字段和方法上的强大功能。
                1. SuperClassReflectionUtils.java
package zmx.reflect.test;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;/** * 获取父类中的所有属性和方法 工具类 * @author zhangwenchao * */public class SuperClassReflectionUtils {  /**      * 循环向上转型, 获取对象的 DeclaredMethod      * @param object : 子类对象      * @param methodName : 父类中的方法名      * @param parameterTypes : 父类中的方法参数类型      * @return 父类中的方法对象      */            public static Method getDeclaredMethod(Object object, String methodName, Class<?> ... parameterTypes){           Method method = null ;                      for(Class<?> clazz = object.getClass(); clazz != Object.class; clazz = clazz.getSuperclass()) {               try {                   method = clazz.getDeclaredMethod(methodName, parameterTypes) ;                   return method ;               } catch (Exception e) {                   //这里甚么都不要做!并且这里的异常必须这样写,不能抛出去。                   //如果这里的异常打印或者往外抛,则就不会执行clazz = clazz.getSuperclass(),最后就不会进入到父类中了                            }           }                      return null;      }          /**   * 直接调用对象方法, 而忽略修饰符(private, protected, default)      * @param object : 子类对象      * @param methodName : 父类中的方法名      * @param parameterTypes : 父类中的方法参数类型      * @param parameters : 父类中的方法参数      * @return 父类中方法的执行结果      */            public static Object invokeMethod(Object object, String methodName, Class<?> [] parameterTypes,              Object [] parameters) {          //根据 对象、方法名和对应的方法参数 通过反射 调用上面的方法获取 Method 对象          Method method = getDeclaredMethod(object, methodName, parameterTypes) ;                    //抑制Java对方法进行检查,主要是针对私有方法而言          method.setAccessible(true) ;                        try {                  if(null != method) {                                            //调用object 的 method 所代表的方法,其方法的参数是 parameters                      return method.invoke(object, parameters) ;                  }              } catch (IllegalArgumentException e) {                  e.printStackTrace();              } catch (IllegalAccessException e) {                  e.printStackTrace();              } catch (InvocationTargetException e) {                  e.printStackTrace();              }                    return null;      }        /**      * 循环向上转型, 获取对象的 DeclaredField      * @param object : 子类对象      * @param fieldName : 父类中的属性名      * @return 父类中的属性对象      */            public static Field getDeclaredField(Object object, String fieldName){          Field field = null ;                    Class<?> clazz = object.getClass() ;                    for(; clazz != Object.class ; clazz = clazz.getSuperclass()) {              try {                  field = clazz.getDeclaredField(fieldName) ;                  return field ;              } catch (Exception e) {                  //这里甚么都不要做!并且这里的异常必须这样写,不能抛出去。                  //如果这里的异常打印或者往外抛,则就不会执行clazz = clazz.getSuperclass(),最后就不会进入到父类中了                                }           }                return null;      }         /**      * 直接设置对象属性值, 忽略 private/protected 修饰符, 也不经过 setter      * @param object : 子类对象      * @param fieldName : 父类中的属性名      * @param value : 将要设置的值      */            public static void setFieldValue(Object object, String fieldName, Object value){                //根据 对象和属性名通过反射 调用上面的方法获取 Field对象          Field field = getDeclaredField(object, fieldName) ;                    //抑制Java对其的检查          field.setAccessible(true) ;                    try {              //将 object 中 field 所代表的值 设置为 value               field.set(object, value) ;          } catch (IllegalArgumentException e) {           e.printStackTrace();          } catch (IllegalAccessException e) {              e.printStackTrace();          }                }        /**      * 直接读取对象的属性值, 忽略 private/protected 修饰符, 也不经过 getter      * @param object : 子类对象      * @param fieldName : 父类中的属性名      * @return : 父类中的属性值      */            public static Object getFieldValue(Object object, String fieldName){                    //根据 对象和属性名通过反射 调用上面的方法获取 Field对象          Field field = getDeclaredField(object, fieldName) ;                    //抑制Java对其的检查          field.setAccessible(true) ;                try {              //获取 object 中 field 所代表的属性值              return field.get(object) ;                        } catch(Exception e) {              e.printStackTrace() ;          }                    return null;      }              }

 2、测试:

2.1 Parent.java

package zmx.reflect.test;public class Parent {     public String publicField  = "1";            String defaultField = "2";             protected String protectedField = "3";            private String privateField = "4" ;            public void publicMethod() {          System.out.println("publicMethod...");      }      void defaultMethod() {          System.out.println("defaultMethod...");      }            protected void protectedMethod() {          System.out.println("protectedMethod...");      }            private void privateMethod() {          System.out.println("privateMethod...");      } }


2.2 Son.java

package zmx.reflect.test;public class Son extends Parent{}

 

2.3 ReflectionUtilsTest.java

package zmx.reflect.test;import java.lang.reflect.Field;import java.lang.reflect.Method;import org.junit.Test;public class ReflectionUtilsTest {     /**      * 测试获取父类的各个方法对象      */            @Test      public void testGetDeclaredMethod() {                    Object obj = new Son() ;                    //获取公共方法名          Method publicMethod = SuperClassReflectionUtils.getDeclaredMethod(obj, "publicMethod") ;          System.out.println(publicMethod.getName());                    //获取默认方法名          Method defaultMethod = SuperClassReflectionUtils.getDeclaredMethod(obj, "defaultMethod") ;          System.out.println(defaultMethod.getName());                    //获取被保护方法名          Method protectedMethod = SuperClassReflectionUtils.getDeclaredMethod(obj, "protectedMethod") ;          System.out.println(protectedMethod.getName());                    //获取私有方法名          Method privateMethod = SuperClassReflectionUtils.getDeclaredMethod(obj, "privateMethod") ;          System.out.println(privateMethod.getName());      }            /**      * 测试调用父类的方法      * @throws Exception      */            @Test      public void testInvokeMethod() throws Exception {          Object obj = new Son() ;                    //调用父类的公共方法          SuperClassReflectionUtils.invokeMethod(obj, "publicMethod", null , null) ;          //调用父类的默认方法          SuperClassReflectionUtils.invokeMethod(obj, "defaultMethod", null , null) ;                    //调用父类的被保护方法          SuperClassReflectionUtils.invokeMethod(obj, "protectedMethod", null , null) ;                    //调用父类的私有方法          SuperClassReflectionUtils.invokeMethod(obj, "privateMethod", null , null) ;      }             /**      * 测试获取父类的各个属性名      */            @Test      public void testGetDeclaredField() {                    Object obj = new Son() ;                    //获取公共属性名          Field publicField = SuperClassReflectionUtils.getDeclaredField(obj, "publicField") ;          System.out.println(publicField.getName());                    //获取公共属性名          Field defaultField = SuperClassReflectionUtils.getDeclaredField(obj, "defaultField") ;          System.out.println(defaultField.getName());                    //获取公共属性名          Field protectedField = SuperClassReflectionUtils.getDeclaredField(obj, "protectedField") ;          System.out.println(protectedField.getName());                    //获取公共属性名          Field privateField = SuperClassReflectionUtils.getDeclaredField(obj, "privateField") ;          System.out.println(privateField.getName());                }            @Test      public void testSetFieldValue() {                    Object obj = new Son() ;                    System.out.println("原来的各个属性的值: ");          System.out.println("publicField = " + SuperClassReflectionUtils.getFieldValue(obj, "publicField"));          System.out.println("defaultField = " + SuperClassReflectionUtils.getFieldValue(obj, "defaultField"));          System.out.println("protectedField = " + SuperClassReflectionUtils.getFieldValue(obj, "protectedField"));          System.out.println("privateField = " + SuperClassReflectionUtils.getFieldValue(obj, "privateField"));                    SuperClassReflectionUtils.setFieldValue(obj, "publicField", "a") ;          SuperClassReflectionUtils.setFieldValue(obj, "defaultField", "b") ;          SuperClassReflectionUtils.setFieldValue(obj, "protectedField", "c") ;          SuperClassReflectionUtils.setFieldValue(obj, "privateField", "d") ;                    System.out.println("***********************************************************");                    System.out.println("将属性值改变后的各个属性值: ");          System.out.println("publicField = " + SuperClassReflectionUtils.getFieldValue(obj, "publicField"));          System.out.println("defaultField = " + SuperClassReflectionUtils.getFieldValue(obj, "defaultField"));          System.out.println("protectedField = " + SuperClassReflectionUtils.getFieldValue(obj, "protectedField"));          System.out.println("privateField = " + SuperClassReflectionUtils.getFieldValue(obj, "privateField"));                }  }


 



 

           
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值