Java 我无法创建嵌套类的实例,并且可以';不要初始化字段。我想通过单元测试

Java 我无法创建嵌套类的实例,并且可以';不要初始化字段。我想通过单元测试,java,reflection,junit,Java,Reflection,Junit,我在调试模式下获得嵌套类的类类型,但无法创建实例以在下一步初始化嵌套实例的字段。(见我的台词)。所以我的单元测试失败了 public class Reflector { public static <T> T initialize(Class<? extends T> clazz) { try { Object classInstance = clazz.newInstance(); System.out.println("Mai

我在调试模式下获得嵌套类的类类型,但无法创建实例以在下一步初始化嵌套实例的字段。(见我的台词)。所以我的单元测试失败了

public class Reflector {
public static <T> T initialize(Class<? extends T> clazz) {

    try {
        Object classInstance = clazz.newInstance();
        System.out.println("MainclassInstance: "+ classInstance.toString());

        for (Field field : clazz.getDeclaredFields()) {

            System.out.println(
             "\n### 1. For-Schleife\nclazz.getDeclaredFields().size(): " + clazz.getDeclaredFields().length);

            System.out.println("clazz.field: " + field.getName());

            //Class Object
            if (field.getType().isMemberClass()) {

                Object memberClassInstance = field.getType();      //Nested$FirstNested

                System.out.println("memberClassInstance: " + memberClassInstance.toString()); //Nested$FirstNested

                List<Field> memberClassFields = Arrays.asList(((Class<?>) memberClassInstance).getDeclaredFields());

                for (int memberFieldIndex = 0; memberFieldIndex < memberClassFields.size() - 1; memberFieldIndex++) {
                    System.out.println("meberClassField: " + memberClassFields.get(memberFieldIndex).getName());


                    //memberClassFields.get(memberFieldIndex).set(memberClassInstance, "nestedField");
                }
                //field.set(memberClassInstance, "MyObject");
                //field.set(classInstance, memberClassInstance);
            }

        }

        return (T) classInstance;

    } catch (SecurityException | IllegalArgumentException e) {
        e.printStackTrace();
    } catch (InstantiationException ex) {
        Logger.getLogger(Reflector.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        Logger.getLogger(Reflector.class.getName()).log(Level.SEVERE, null, ex);
    }

    return null;
}
这是数据类

public class Nested {

    public class FirstNested{
        public Object nestedField1;
        public Object nestedField2;
    }

    public class SecondNested{
        public Object nestedField3;
        public Object nestedField4;
    }

    public FirstNested nested1;
    public SecondNested nested2;

}

问题是,尽管您为容器类
Nested
创建了实例,但没有为封闭类
FirstNested
SecondNested
创建实例。为了创建此类实例,您可以像这样更改您的类

public static class Nested
{
    public static class FirstNested
    {
        public Object nestedField1;
        public Object nestedField2;
    }

    public static class SecondNested
    {
        public Object nestedField3;
        public Object nestedField4;
    }

    public FirstNested nested1;
    public SecondNested nested2;

}
Object memberClassInstance = field.getType().newInstance();
field.set(classInstance, memberClassInstance);
Object memberClassInstance = field.getType().getConstructor(Nested.class).newInstance()
必须使内部类保持静态,以便通过反射轻松访问它们。然后,您必须实现(可能以递归方式)创建新实例,并将这些实例注册到您的容器类实例中

像这样的

public static class Nested
{
    public static class FirstNested
    {
        public Object nestedField1;
        public Object nestedField2;
    }

    public static class SecondNested
    {
        public Object nestedField3;
        public Object nestedField4;
    }

    public FirstNested nested1;
    public SecondNested nested2;

}
Object memberClassInstance = field.getType().newInstance();
field.set(classInstance, memberClassInstance);
Object memberClassInstance = field.getType().getConstructor(Nested.class).newInstance()
或者您可以保持类的原样,并使用类似的内容

public static class Nested
{
    public static class FirstNested
    {
        public Object nestedField1;
        public Object nestedField2;
    }

    public static class SecondNested
    {
        public Object nestedField3;
        public Object nestedField4;
    }

    public FirstNested nested1;
    public SecondNested nested2;

}
Object memberClassInstance = field.getType().newInstance();
field.set(classInstance, memberClassInstance);
Object memberClassInstance = field.getType().getConstructor(Nested.class).newInstance()

正如@CoronA在评论中提到的那样。有关如何实例化内部类的更多信息,请参见此处

问题在于,尽管您为容器类
嵌套
创建了实例,但没有为封闭类
第一嵌套
第二嵌套
创建实例。为了创建此类实例,您可以像这样更改您的类

public static class Nested
{
    public static class FirstNested
    {
        public Object nestedField1;
        public Object nestedField2;
    }

    public static class SecondNested
    {
        public Object nestedField3;
        public Object nestedField4;
    }

    public FirstNested nested1;
    public SecondNested nested2;

}
Object memberClassInstance = field.getType().newInstance();
field.set(classInstance, memberClassInstance);
Object memberClassInstance = field.getType().getConstructor(Nested.class).newInstance()
必须使内部类保持静态,以便通过反射轻松访问它们。然后,您必须实现(可能以递归方式)创建新实例,并将这些实例注册到您的容器类实例中

像这样的

public static class Nested
{
    public static class FirstNested
    {
        public Object nestedField1;
        public Object nestedField2;
    }

    public static class SecondNested
    {
        public Object nestedField3;
        public Object nestedField4;
    }

    public FirstNested nested1;
    public SecondNested nested2;

}
Object memberClassInstance = field.getType().newInstance();
field.set(classInstance, memberClassInstance);
Object memberClassInstance = field.getType().getConstructor(Nested.class).newInstance()
或者您可以保持类的原样,并使用类似的内容

public static class Nested
{
    public static class FirstNested
    {
        public Object nestedField1;
        public Object nestedField2;
    }

    public static class SecondNested
    {
        public Object nestedField3;
        public Object nestedField4;
    }

    public FirstNested nested1;
    public SecondNested nested2;

}
Object memberClassInstance = field.getType().newInstance();
field.set(classInstance, memberClassInstance);
Object memberClassInstance = field.getType().getConstructor(Nested.class).newInstance()
正如@CoronA在评论中提到的那样。有关如何实例化内部类的更多信息,请参见此处

正确的解决方案:

public class Reflector {
public static <T> T initialize(Class<? extends T> clazz) {

    try {
        Object classInstance = clazz.newInstance();
        System.out.println("MainclassInstance: " + classInstance.toString());

        for (Field field : clazz.getDeclaredFields()) {

            System.out.println(
                    "\n### 1. For-Schleife\nclazz.getDeclaredFields().size(): "
                    + clazz.getDeclaredFields().length);

            System.out.println("clazz.field: " + field.getName());


            //Class Object
            if (field.getType().isMemberClass()) {


                Object innerInstance = null;
                try {

                    Class<?> innerClass = Class.forName(field.getType().getName());
                    Constructor<?> ctor = innerClass.getDeclaredConstructor(classInstance.getClass());
                    innerInstance = ctor.newInstance(classInstance);
                } catch (InvocationTargetException ex) {
                    Logger.getLogger(Reflector.class.getName()).log(Level.SEVERE, null, ex);
                } catch (ClassNotFoundException ex) {
                    Logger.getLogger(Reflector.class.getName()).log(Level.SEVERE, null, ex);
                } catch (NoSuchMethodException ex) {
                    Logger.getLogger(Reflector.class.getName()).log(Level.SEVERE, null, ex);
                }

                //###############
                Object memberClassInstance = field.getType();      //Nested$FirstNested

                System.out.println("memberClassInstance: " + memberClassInstance.toString()); //Nested$FirstNested

                List<Field> memberClassFields = Arrays.asList((innerInstance.getClass()).getDeclaredFields());

                for (int memberFieldIndex = 0; memberFieldIndex < memberClassFields.size() - 1; memberFieldIndex++) {
                    System.out.println("meberClassField: " + memberClassFields.get(memberFieldIndex).getName());
                    memberClassFields.get(memberFieldIndex).set(innerInstance, memberClassFields.get(memberFieldIndex).getName() + (memberFieldIndex+1));     
                }

                field.set(classInstance,innerInstance);

            }

        }

        return (T) classInstance;

    } catch (SecurityException | IllegalArgumentException e) {
        e.printStackTrace();
    } catch (InstantiationException ex) {
        Logger.getLogger(Reflector.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        Logger.getLogger(Reflector.class.getName()).log(Level.SEVERE, null, ex);
    }

    return null;
}
公共类反射器{
公共静态T初始化(类正确的解决方案:

public class Reflector {
public static <T> T initialize(Class<? extends T> clazz) {

    try {
        Object classInstance = clazz.newInstance();
        System.out.println("MainclassInstance: " + classInstance.toString());

        for (Field field : clazz.getDeclaredFields()) {

            System.out.println(
                    "\n### 1. For-Schleife\nclazz.getDeclaredFields().size(): "
                    + clazz.getDeclaredFields().length);

            System.out.println("clazz.field: " + field.getName());


            //Class Object
            if (field.getType().isMemberClass()) {


                Object innerInstance = null;
                try {

                    Class<?> innerClass = Class.forName(field.getType().getName());
                    Constructor<?> ctor = innerClass.getDeclaredConstructor(classInstance.getClass());
                    innerInstance = ctor.newInstance(classInstance);
                } catch (InvocationTargetException ex) {
                    Logger.getLogger(Reflector.class.getName()).log(Level.SEVERE, null, ex);
                } catch (ClassNotFoundException ex) {
                    Logger.getLogger(Reflector.class.getName()).log(Level.SEVERE, null, ex);
                } catch (NoSuchMethodException ex) {
                    Logger.getLogger(Reflector.class.getName()).log(Level.SEVERE, null, ex);
                }

                //###############
                Object memberClassInstance = field.getType();      //Nested$FirstNested

                System.out.println("memberClassInstance: " + memberClassInstance.toString()); //Nested$FirstNested

                List<Field> memberClassFields = Arrays.asList((innerInstance.getClass()).getDeclaredFields());

                for (int memberFieldIndex = 0; memberFieldIndex < memberClassFields.size() - 1; memberFieldIndex++) {
                    System.out.println("meberClassField: " + memberClassFields.get(memberFieldIndex).getName());
                    memberClassFields.get(memberFieldIndex).set(innerInstance, memberClassFields.get(memberFieldIndex).getName() + (memberFieldIndex+1));     
                }

                field.set(classInstance,innerInstance);

            }

        }

        return (T) classInstance;

    } catch (SecurityException | IllegalArgumentException e) {
        e.printStackTrace();
    } catch (InstantiationException ex) {
        Logger.getLogger(Reflector.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        Logger.getLogger(Reflector.class.getName()).log(Level.SEVERE, null, ex);
    }

    return null;
}
公共类反射器{

public static T initialize(类您的代码未编译。
memberClassInstance
未声明为anyare。请在类refactor的if大小写后插入以下行:Object memberClassInstance=field.getType();//Nested$firstnested只需更新您的原始帖子,这样每个人都可以看到正确的版本。我的代码已更新。这是我的第一篇文章。我是这个论坛的新手:-)不用担心。欢迎。您的代码未编译。
memberClassInstance
未声明为AnyWare。请在类refactor的if大小写后插入以下行:Object memberClassInstance=field.getType();//Nested$FirstNested只需更新您的原始帖子,这样每个人都可以看到正确的版本。我的代码已经更新。这是我的第一篇文章。我是这个论坛的新手:-)不用担心。欢迎。严格来说,没有必要将内部类更改为静态类。使用非静态嵌套内部类,您的lower语句看起来像(!)
对象memberClassInstance=field.getType().getConstructor(Nested.class).newInstance()
(嵌套类构造函数将外部类添加到其参数中)。我应该为此投反对票。感谢你给我机会更正我的答案。严格来说,没有必要将内部类更改为静态类。对于非静态嵌套内部类,下面的语句看起来像(!)
Object memberClassInstance=field.getType().getConstructor(nested.class).newInstance()
(嵌套类构造函数将外部类添加到它们的参数中)。我应该为此投反对票。感谢您给我机会更正我的答案。