当前位置: 首页 > 知识库问答 >
问题:

反射——如何为POJO类设置值,该类的实例是使用反射创建的

蒙洛华
2023-03-14

我使用反射为我的 pojo 类创建了一个实例,如下所示:

package com.hexgen.tools;

public class Foo {

    public static void main(String[] args) {
        Class c = null;
        try {
            c = Class.forName("com.hexgen.ro.request.CreateRequisitionRO");
            Object o = c.newInstance();
            System.out.println(o.toString());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }   catch (IllegalAccessException iae) {
            iae.printStackTrace();
        } catch (InstantiationException ie) {
            ie.printStackTrace();
        }  
    }
}

当我打印时,我得到了以下字符串:

< code > com . hex gen . ro . request . createrequisitionro @ 95c 7850[trans srlno =

实际上,所有值都设置为null,我希望为类中可用的setter设置值。因为setters名称可以随时更改,所以我计划动态设置值,这样就不会发生静态值设置。

是否可以为新创建的实例动态设置值?比如创建一些枚举并在枚举中具有一些默认值,比如如果它是字符串,则设置一些默认值,如果int设置一些默认值,则如此。

how to do this also i created a object which is not a array if i want to create array of objects using reflection how to go about it?

请帮我弄清楚并修复这些…

共有2个答案

何向荣
2023-03-14

您可以使用类对象定义的字段:

Field f  = c.getFields()[0]; //or getField("...")
f.set(o, "new value");

编辑:如果你想只使用setter:

for(Method m : c.getMethods())
  if (m.getName().startsWith("set") && m.getParameterTypes().length == 1)
     m.invoke(o, "myValue");
韦衡
2023-03-14

根据定义,POJO没有标准制定者。我怀疑你指的是JavaBean。

要使用JavaBean的setter,最简单的方法是使用Introspector。

public class Main {
    public static void main(String... ignored) throws Exception {
        SimpleBean sb = new SimpleBean();

        BeanInfo info = Introspector.getBeanInfo(SimpleBean.class);
        System.out.println("Calling setters");
        for (PropertyDescriptor pd : info.getPropertyDescriptors()) {
            if (pd.getWriteMethod() == null) continue;
            System.out.println("\tSetting " + pd.getName());
            pd.getWriteMethod().invoke(sb, "Set now");
        }
        System.out.println("Reading the getters");
        for (PropertyDescriptor pd : info.getPropertyDescriptors()) {
            System.out.println("\t" + pd.getName() + " = " + pd.getReadMethod().invoke(sb));
        }
    }


    public static class SimpleBean {
        String text;
        String words;

        public String getText() {
            return text;
        }

        public void setText(String text) {
            this.text = text;
        }

        public String getWords() {
            return words;
        }

        public void setWords(String words) {
            this.words = words;
        }
    }
}

印刷品

Calling setters
    Setting text
    Setting words
Reading the getters
    class = class Main$SimpleBean
    text = Set now
    words = Set now
 类似资料:
  • 我正在试验反射库发现:https://code.google.com/p/reflections/ 我试图实现的是扫描项目中的一个包,然后创建在该包中找到的给定类型的所有子类的实例。我使用库的方式是正确的,因为子类型返回以下内容: [class identifiers.DNSLookup,class identifiers.AliasChecker,class identifiers.Google

  • 问题内容: 可以使用反射在抽象祖先类中创建派生类的实例吗? } 问题答案: 你可以这样做 版画 一种更常见的模式是使用Cloneable 版画 但是,应避免使用两者之一。通常,还有另一种方法可以满足您的需求,因此基础不会隐式地依赖于派生。

  • 本文向大家介绍PHP类的反射用法实例,包括了PHP类的反射用法实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP类的反射用法。分享给大家供大家参考。具体实现方法如下: 该例实现对于每个频道获取相应的类来执行相应的操作。具体如下: 希望本文所述对大家的PHP程序设计有所帮助。

  • 本文向大家介绍PHP的反射类ReflectionClass、ReflectionMethod使用实例,包括了PHP的反射类ReflectionClass、ReflectionMethod使用实例的使用技巧和注意事项,需要的朋友参考一下 PHP5 具有完整的反射API,添加对类、接口、函数、方法和扩展进行反向工程的能力。 反射是什么? 它是指在PHP运行状态中,扩展分析PHP程序,导出或提取出关于类

  • 问题内容: 我所考虑的所有示例都显示了如何创建一个未知实现的新实例,并将该实现投射到其接口。问题在于,现在您不能在实现类上调用任何新方法(只能重写),因为您的对象引用变量具有接口类型。这是我所拥有的: 如果我仅引用“ com.path.to.ImplementationType”,而我不知道该类型可能是什么(它来自配置文件),那么如何使用类名将其强制转换为实施类型?这有可能吗? 问题答案: 这行似

  • 问题内容: 例如: 清除代码。 但是,如果我添加带有参数的构造函数,则如下所示: 我懂了: 因此,不,我不知道如何通过构造函数传递参数。 请帮忙。 问题答案: 您需要说出您要使用pass it参数的构造函数。