java反射属性并赋值,java反射给字段赋值

  java反射属性并赋值,java反射给字段赋值

  00-1010将实体类的所有字段指定为空会导致第一个方法和第二个方法将实体类中的空属性设置为“”,或者空工具类测试类首先创建所需的实体。

  

目录

 

  00-1010当我们要使用一个实体类的时候,如果我们发现在创建这个类的时候,我们为一些字段设置了初始值(某些场景下的特殊需要),但是这个时候我们不需要这些初始值,我们会想把这些值全部清除,使之成为一个干净的类。我们可以手动逐个分配空值。我一开始就是这么做的。同事看到后告诉我的。可以尝试使用反射机制,自己封装一个工具类,让所有人都可以使用。所以我这么做了,得到了下面这段比较低B的代码:

  我的代码:

  公共静态Void ReflectClassValueTonull(对象模型)throws exception {//获取该类ListClass的所有父类?list super class=lists . new ArrayList();班级?superclass=model.getClass()。get super class();while(超类!=null) { if (superclass.getName()。equals( Java . lang . object ){ break;} listSuperClass.add(超类);super class=super class . get super class();}//遍历(Class?clazz : list super class){ Field[]fields=clazz . getdeclaredfields();for(int I=0;I字段.长度;i ) { String name=fields[i]。getName();类类型=字段[i]。getType();method method=clazz . get method( set name . replace first(name.substring(0,1),name . substring(0,1))。toUpperCase()),type);method.invoke(模型,新对象[]{ null });} }//处理这个类自己的字段field [] fields=model.getclass()。GetDeclaredFields();for(int I=0;I字段.长度;i ) { String name=fields[i]。getName();类类型=字段[i]。getType();//获取attribute=model.getclass()的set method方法。get method( set name . replace first(name.substring (0,1),name . substring(0,1))。Toupper Case()),type);//将值设置为nullmethod.invoke (model,new object[]{ null });}}代码写出来的那一刻,真的很爽。这个东西虽然比较简单,但是还是很有成就感的。然后我跟同事说是我写的,让他帮我优化一下(毕竟他在我心里是个真正的大牛)。午休后,他给我发了两个方法,实现方式不同,但都是基于反射机制。这是他的代码:

  

将一个实体类所有字段赋值为null

public static T T by method(T T){ reflection utils . getall methods(T . getclass(),method - Objec

 

  ts.requireNonNull(method).getName().indexOf("set") == 0).forEach(method -> {            try {                method.invoke(t, new Object[]{null});            } catch (IllegalAccessException InvocationTargetException e) {                throw new RuntimeException(e);            }        });        return t;    }

 

  

第二种方法

public static <T> T byField(T t) {        ReflectionUtils.getAllFields(t.getClass()).forEach(field -> {            try {                field.setAccessible(true);                field.set(t, null);            } catch (IllegalAccessException e) {                throw new RuntimeException(e);            }        });        return t;    }

所以,差距你们看到了吗?反正我看到了!

 

  

 

  

将实体类中的null属性置为或者空值

 

  

工具类

package com.chryl.util; import java.lang.reflect.Field;import java.lang.reflect.Method; public class ReflectionUtils {     /**     * 将实体类中的String类型属性为null的置为""     *     * @param o     * @return     */    public static Object nullifyStrings(Object o) {        Field[] declaredFields = o.getClass().getDeclaredFields();        for (Field f : declaredFields) {            f.setAccessible(true);            String name = f.getName();            if ("serialVersionUID".equals(name)) {                continue;            }            //获取属性类型            Class type = f.getType();            try {                //只操作String类型                if (type.equals(String.class)) {                    String value = (String) f.get(o);                    //如果为空                    if (value == null value.trim().isEmpty()) {                        //获取属性的set方法                        Method method = o.getClass().getMethod("set" + name.replaceFirst(name.substring(0, 1), name.substring(0, 1).toUpperCase()), type);//                        f.set(o, null);                        //将值设为空串                        method.invoke(o, "");                    }                }            } catch (Exception e) {                throw new RuntimeException(e);            }        }        return o;    }      /**     * 含递归     * 将实体类中的 String类型或对象 属性为null的置为""或空对象     *     * @param o     * @return     */    public static Object nullifyObjectOrStrings(Object o) throws ClassNotFoundException {        Field[] declaredFields = o.getClass().getDeclaredFields();        for (Field f : declaredFields) {            f.setAccessible(true);            String name = f.getName();            if ("serialVersionUID".equals(name)) {                continue;            }             //获取属性类型            Class type = f.getType();            try {                //获取属性的set方法                String setterMethod = "set" + name.replaceFirst(name.substring(0, 1), name.substring(0, 1).toUpperCase());                Method method = o.getClass().getMethod(setterMethod, type);                //只操作String类型                if (type.equals(String.class)) {                    String value = (String) f.get(o);                    //如果为空                    if (value == null value.trim().isEmpty()) {//                        f.set(o, null);                        //将值设为空串                        method.invoke(o, "");                    }                } else {                    Class<?> aClass = Class.forName(f.getGenericType().getTypeName());                    Object createObj = aClass.newInstance();                    //实体赋值                    method.invoke(o, createObj);                    nullifyObjectOrStrings(createObj);                }            } catch (Exception e) {                throw new RuntimeException(e);            }        }        return o;    }}

 

  

测试类

package com.chryl.test;  import com.chryl.entity.User;import com.chryl.util.ReflectionUtils; /** * Created By Chryl on 2021-08-11. */public class NullStrTest {    public static void main(String[] args) throws Exception {         User user = new User();        User user1 = (User) ReflectionUtils.nullifyStrings(user);        System.out.println(user1);         User user12 = (User) ReflectionUtils.nullifyObjectOrStrings(user);        System.out.println(user12);      } }

 

  

先创建需要的实体

package com.chryl.entity; import java.io.Serializable; /** * Created By Chryl on 2021-08-11. */public class User implements Serializable {    private static final long serialVersionUID = 930878416859194735L;     private String username;    private String password;    private String age;    private ParamsList paramsList;     public User() {    }     public User(String username, String password, String age) {        this.username = username;        this.password = password;        this.age = age;    }     public User(String username, String password, String age, ParamsList paramsList) {        this.username = username;        this.password = password;        this.age = age;        this.paramsList = paramsList;    }     public static long getSerialVersionUID() {        return serialVersionUID;    }     public String getUsername() {        return username;    }     public void setUsername(String username) {        this.username = username;    }     public String getPassword() {        return password;    }     public void setPassword(String password) {        this.password = password;    }     public String getAge() {        return age;    }     public void setAge(String age) {        this.age = age;    }     public ParamsList getParamsList() {        return paramsList;    }     public void setParamsList(ParamsList paramsList) {        this.paramsList = paramsList;    }}
package com.chryl.entity; /** * Created By Chryl on 2021-08-12. */public class ParamsList {    private String param1;    private String param2;    private String param3;    private String param4;     public ParamsList() {    }     public ParamsList(String param1, String param2, String param3, String param4) {        this.param1 = param1;        this.param2 = param2;        this.param3 = param3;        this.param4 = param4;    }     public String getParam1() {        return param1;    }     public void setParam1(String param1) {        this.param1 = param1;    }     public String getParam2() {        return param2;    }     public void setParam2(String param2) {        this.param2 = param2;    }     public String getParam3() {        return param3;    }     public void setParam3(String param3) {        this.param3 = param3;    }     public String getParam4() {        return param4;    }     public void setParam4(String param4) {        this.param4 = param4;    }}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持盛行IT。

 

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: