Java 反射调用setter或getter的工具方法和工具类(无需异常处理)


工具类与工具方法的区别:

  • 工具方法适用于对同一对象进行较少次数的set与get
  • 工具类适用于对同一对象进行较多次数的set与get

两个方法都自带异常处理机制,不会影响代码的后续运行,setter方法发生异常则相当于无效语句,getter方法发生异常则返回null值
注意 : 以下反射调用的方法都无视私有权限,但是只能调用本类实现的方法

工具方法------反射调用setter

使用方法 :

Person person= new Person ();
reflectSetter(person, "id", 1);

java代码 :

/**
* @param obj   需要被赋值的对象
* @param attr  对象的属性名
* @param value 被赋予的值
*/
public static void reflectSetter(Object obj, String attr, Object value) {
   //获取对象类
   Class cls = obj.getClass();
   //获取方法集
   Method[] methods = cls.getDeclaredMethods();
   Method setter = null;
   String setterRegex = "^set" + attr.toLowerCase();
   //查找并执行setter方法
   for (Method x : methods) {
       String metdName = x.getName().toLowerCase();
       if (metdName.matches(setterRegex)) {
           setter = x;
       }
   }
   if (setter == null)
       System.err.println("没有找到对应属性名的setter");
   else{
       boolean flag = setter.isAccessible();
       try {
           setter.setAccessible(true);
           setter.invoke(obj, value);
       } catch (Exception e) {
           System.err.println("设置属性值失败(可能是value类型不匹配)");
           e.printStackTrace();
       }finally {
           setter.setAccessible(flag);
       }
   }
}

工具方法------反射调用getter

使用方法 :

Person person = new Person ();
Integer value = reflectGetter(person, "id",Integer.class);

java代码 :

/**
* @param obj  需要获取其值的对象
* @param attr 对象的属性名
* @param valueType 属性值的类型
*/
public static <T>T reflectGetter(Object obj, String attr, Class<T> valueType) {
   //获取对象类
   Class cls = obj.getClass();
   //获取方法集
   Method[] methods = cls.getDeclaredMethods();
   Method getter = null;
   String getterRegex = "^get" + attr.toLowerCase();
   //查找并执行getter方法
   for (Method x : methods) {
       String metdName = x.getName().toLowerCase();
       if (metdName.matches(getterRegex)) {
           getter = x;
       }
   }
   T value=null;
   if (getter == null)
       System.err.println("没有找到对应属性名的getter(返回null)");
   else{
       boolean flag = getter.isAccessible();
       try {
           getter.setAccessible(true);
           value= valueType.cast(getter.invoke(obj));
       } catch (ClassCastException e) {
           e.printStackTrace();
           System.err.println("属性值的类型不正确(返回null)");
       } catch (Exception e) {
           e.printStackTrace();
           System.err.println("获取属性值失败(返回null)");
       }finally {
           getter.setAccessible(flag);
       }
   }
   return value;
}

工具类------反射调用getter与setter

使用方法 :

Person person= new Person ();
ReflectTool handler = ReflectTool.getReflectHandler(person);//获取访问对象
handler.setter("ID", 12);//setter
Integer n = handler.getter("ID", Integer.class);//getter

java代码 :

public class ReflectTool {
   private Class cls;
   private Object obj;
   private Map<String, Method> getterMethods;
   private Map<String, Method> setterMethods;

   public static ReflectTool reflectToolFactory(Object obj) {
       return new ReflectTool(obj);
   }

   private ReflectTool(Object obj) {
       this.obj = obj;
       this.cls = obj.getClass();
       this.getterMethods = new HashMap<>();
       this.setterMethods = new HashMap<>();
       //获取方法集
       Method[] methods = cls.getDeclaredMethods();
       String setterRegex = "^set[a-zA-Z_$0-9]+";
       String getterRegex = "^get[a-zA-Z_$0-9]+";
       //初始化getter与setter方法集
       for (Method x : methods) {
           boolean flag=x.isAccessible();
           x.setAccessible(true);
           String metdName = x.getName().toLowerCase();
           if (metdName.matches(setterRegex)) {
               String attrName = metdName.replaceFirst("set", "");
               this.setterMethods.put(attrName, x);
           } else if (metdName.matches(getterRegex)) {
               String attrName = metdName.replaceFirst("get", "");
               this.getterMethods.put(attrName, x);
           }
           x.setAccessible(flag);
       }
   }

   /**
    * @param attr  对象的属性名
    * @param value 被赋予的值
    */
   public void setter(String attr, Object value) {
       Method setter = setterMethods.get(attr.toLowerCase());
       if (setter == null)
           System.err.println("没有找到对应属性名的setter");
       else {
           boolean flag = setter.isAccessible();
           try {
               setter.setAccessible(true);
               setter.invoke(obj, value);
           } catch (Exception e) {
               System.err.println("设置属性值失败(可能是value类型不匹配)");
               e.printStackTrace();
           } finally {
               setter.setAccessible(flag);
           }
       }
   }

   /**
    * @param attr      对象的属性名
    * @param valueType 属性值的类型
    */
   public <T> T getter(String attr, Class<T> valueType) {
       Method getter = getterMethods.get(attr.toLowerCase());
       T value = null;
       if (getter == null)
           System.err.println("没有找到对应属性名的getter(返回null)");
       else {
           boolean flag = getter.isAccessible();
           try {
               getter.setAccessible(true);
               value = valueType.cast(getter.invoke(obj));
           } catch (ClassCastException e) {
               e.printStackTrace();
               System.err.println("属性值的类型不正确(返回null)");
           } catch (Exception e) {
               e.printStackTrace();
               System.err.println("获取属性值失败(返回null)");
           } finally {
               getter.setAccessible(flag);
           }
       }
       return value;
   }
}

猜你喜欢

转载自blog.csdn.net/qq_44460210/article/details/90206177