【问题标题】:Java - Reflection. Set value for the class object which are dynamically createdJava - 反射。为动态创建的类对象设置值
【发布时间】:2013-04-29 08:50:16
【问题描述】:

嗨,我有一个类[许多],我在运行时动态地为它创建对象。现在我想为字段which are private fields 设置值。如何设置它们。

我看过很多例子来解释这一点,但我们需要知道字段名称,并且只能设置值。

就我而言,我有一组原始和非原始类型的默认值,并在运行时找到字段类型并为它们设置默认值。

例如:

LoginBean loginBean = new LoginBean();
Method setUserName = loginBean.getClass().getMethod("setUserName", new Class[]{String.class});
setUserName.invoke(loginBean, "myLogin");

我的情况不同,我什至不知道field name,但必须根据字段类型设置默认值。

如何在春季使用反射甚至更好地做到这一点。

【问题讨论】:

  • 您可能想解释一下为什么您要这样做?

标签: java spring-mvc reflection


【解决方案1】:

你可以说yourBean.class.getFields();,这将给出Field的数组。

使用Field,您可以找到它的nametype,然后执行所需的工作(设置一些值,如果它的类型是== 一些原始类型)

【讨论】:

    【解决方案2】:

    此示例使用反射在类中的多个字段上设置默认值。这些字段具有私有访问权限,可通过反射打开和关闭。 Field.set() 用于在特定实例上设置字段的值,而不是使用 setter 方法。

    import java.lang.reflect.Field;
    import java.util.Date;
    
    
    public class StackExample {
    
        private Integer field1 = 3;
        private String field2 = "Something";
        private Date field3;
    
        public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException {
            StackExample se = new StackExample();
    
            Field[] fields = se.getClass().getDeclaredFields();
    
            for(Field f:fields){
                if(!f.isAccessible()){
                    f.setAccessible(true);
                    Class<?> type = f.getType();
    
                    if(type.equals(Integer.class)){
                        f.set(se, 100); //Set Default value
                    }else if(type.equals(String.class)){
                        f.set(se, "Default");
                    }else if (type.equals(Date.class)){
                        f.set(se, new Date());
                    }
                    f.setAccessible(false);
                }
                System.out.println(f.get(se)); //print fields with reflection
            }
        }
    }
    

    【讨论】:

    • @Anto 如果您有任何问题,请告诉我
    • 嗨凯文,谢谢它帮助了我。如果我想打印并查看我设置的值,我该怎么做。因为您知道字段名称,所以您已按名称打印它们。假设我不知道该字段,因为它们是动态创建的。
    • @Anto 我更新了代码示例以使用反射打印字段值。基本上它遍历字段并使用field.get()
    • 嗨,凯文,我知道了Class com.hexgen.tools.JsonConverter can not access a member of class java.lang.Class with modifiers "private static final"
    • 凯文的值没有设置
    【解决方案3】:

    1) 通过使用 Spring 构造函数/Setter 注入。您不需要知道属性名称,只需键入即可。如下:

    <bean id="myBean" class="myBean">
      <constructor-arg type="int"><value>1</value></constructor-arg>
    </bean>
    

    【讨论】:

    • 通过java反射,你可以得到所有的字段和它们的类型。但你不会得到字段的名称
    • Field 有一个属性 name 是字段的名称!
    • 字段名只提供公共字段的信息,不能从那里访问私有字段。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    • 2017-03-29
    • 2013-02-13
    相关资源
    最近更新 更多