java - 创建类的实例并初始化其所有字段

标签 java reflection jaxb

我想创建一个类的实例,但我还需要递归地初始化它的所有字段。

您看到与 objectFactory 相关的代码是因为其中一些类可能是 JAXB 类,因此对于每个包都有一个带有 createJaxbObject(....) 等方法的 ObjectFactory。

编辑:

我的最终解决方案是这样的:

public Object getInstance(Class<?> instanceClass, Boolean simple,
        String jaxbName) {

    Object instance = null;
    try {
        if (instanceClass.isPrimitive())
            return primitiveValues.get(instanceClass.getName());
        if (List.class.isAssignableFrom(instanceClass))
            return new ArrayList();
        else if (instanceClass.isEnum())
            return instanceClass.getEnumConstants()[0];
        else if (instanceClass.isArray())
            return java.lang.reflect.Array.newInstance(instanceClass, 1);
        else if (BigInteger.class.isAssignableFrom(instanceClass))
            return new BigInteger("0");
        else if (instanceClass.equals(String.class))
            return "";
        else if (instanceClass.equals(Boolean.class))
            return false;
        else if (instanceClass.equals(EntityObjectStringType.class))
            return new EntityObjectStringType();
        else if (JAXBElement.class.isAssignableFrom(instanceClass)) {
            try {
                Method m = null;
                Class<?> objFactoryClass = null;
                Iterator<String> it = EditorServlet.objectFactories
                        .iterator();
                Object of = null;
                while (it.hasNext()) {
                    objFactoryClass = Class.forName(it.next());
                    of = objFactoryClass.getConstructor().newInstance();
                    m = getMethodFromObjectFactory(objFactoryClass,
                            jaxbName);
                    if (m != null)
                        if (m.getParameterTypes().length > 0)
                            break;
                }
                Object jaxbElement = getInstance(m.getParameterTypes()[0],
                        m.getParameterTypes()[0].getSimpleName());
                return m.invoke(of, jaxbElement);

            } catch (NoSuchMethodException e) {
                logger.error("JAXB NoSuchMethodException");
            }
        } else
            try {
                logger.info("Costruttori per " + instanceClass.getName()
                        + " " + instanceClass.getConstructors().length);
                instance = instanceClass.getConstructor().newInstance();
            } catch (NoSuchMethodException noSuchMethodException) {
                logger.error("getConstructors NoSuchMethodException");
            }
    } catch (IllegalArgumentException e) {
        logger.error("IllegalArgumentException " + instanceClass.getName());
    } catch (SecurityException e) {
        logger.error("SecurityException " + instanceClass.getName());
    } catch (InstantiationException e) {
        logger.error("InstantiationException " + instanceClass.getName()
                + " " + instanceClass.isPrimitive());
    } catch (IllegalAccessException e) {
        logger.error("IllegalAccessException " + instanceClass.getName());
    } catch (InvocationTargetException e) {
        logger.error("InvocationTargetException " + instanceClass.getName());
    } catch (ClassNotFoundException e) {
        logger.error("ClassNotFoundException " + instanceClass.getName());
    }
    if (!simple) {
        for (Field field : instanceClass.getDeclaredFields()) {
            try {
                Object fieldInstance = getInstance(field.getType(),
                        field.getName());
                field.setAccessible(true);
                field.set(instance, fieldInstance);
            } catch (IllegalArgumentException e) {
                logger.error("IllegalArgumentException "
                        + instanceClass.getName());
            } catch (IllegalAccessException e) {
                logger.error("IllegalAccessException "
                        + instanceClass.getName());
            }
        }
    }

    return instance;
}

最佳答案

如果我可以冒险猜测一下,您将在 NoSuchMethodException catch 中递归调用您的方法。

Object of = getInstance(objFactoryClass);

如果你的递归调用一直找不到方法:

Method m = getMethodFromObjectFactory(objFactoryClass, c);

...该方法将再次调用自身,这应该在某个时刻以 StackOverflowError 结束。

关于java - 创建类的实例并初始化其所有字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20214446/

相关文章:

java - Hibernate - 从另一个表中选择具有 id 的实体?

通过注解注入(inject) Java 字段

java - 如何使用 JAXB 解析嵌套节点中的属性?

java - 将自定义 JAXB 上下文与 Jersey 客户端结合使用

java - @RepeatedTest 未启动

java - 让 Gson 在反序列化期间创建空列表而不是 null

c# - 如何确定属性是否是具有反射的自动实现属性?

Java尝试进行反射(类实例并在运行时调用方法)

java - 如何使用 JAXB 驱动程序获取 xml 标签名称

java - Jackson - 错误显示在 "Trace"\"Debug"日志级别