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()
(嵌套类构造函数将外部类添加到它们的参数中)。我应该为此投反对票。感谢您给我机会更正我的答案。