使用通用 java class 时出现 InstantiationException
InstantiationException when using a generic java class
我想创建一个包含实体的模拟。可以有两种实体,复杂实体和简单实体。当我实例化一个简单的模拟时,我希望实例化简单的实体,而当我实例化一个复杂的模拟时,我希望实例化复杂的实体。
实体:
class ComplexEntity extends Entity {
public ComplexEntity(){}
}
class SimpleEntity extends Entity {
public SimpleEntity(){}
}
class Entity {
public Entity(){}
}
模拟:
class ComplexSimulation extends Simulation<ComplexEntity>
{
public ComplexSimulation() throws InstantiationException, IllegalAccessException {
super(ComplexEntity.class);
}
}
class SimpleSimulation extends Simulation<SimpleEntity>
{
public SimpleSimulation() throws InstantiationException, IllegalAccessException
{
super(SimpleEntity.class);
}
}
class Simulation<E extends Entity> {
protected final E entity;
public Simulation(Class<E> class1) throws InstantiationException, IllegalAccessException
{
entity = class1.newInstance();
}
}
问题是当我尝试构造一个 ComplexSimulation 时:
ComplexSimulation c = new ComplexSimulation();
我得到以下 InstantiationException:
java.lang.InstantiationException: test.Test$ComplexEntity
at java.lang.Class.newInstance(Unknown Source)
at test.Test$Simulation.<init>(Test.java:55)
at test.Test$ComplexSimulation.<init>(Test.java:37)
at test.Test.go(Test.java:12)
at test.Test.main(Test.java:6)
Caused by: java.lang.NoSuchMethodException: test.Test$ComplexEntity.<init>()
at java.lang.Class.getConstructor0(Unknown Source)
零参数构造函数不是问题,因为我的实体有它们...有人知道问题出在哪里吗?
问题是您使用的是内部 classes。如果没有外部 class 的实例,则无法创建内部 class 的实例,即使您调用 Class<InnerClass>.newInstance()
.
也是如此
只需将这些内部 classes 设置为顶级 classes 并且您的示例应该按预期工作。
如果你真的want/need使用反射初始化非静态内部classes,请看这里:How to instantiate inner class with reflection in Java?
我想创建一个包含实体的模拟。可以有两种实体,复杂实体和简单实体。当我实例化一个简单的模拟时,我希望实例化简单的实体,而当我实例化一个复杂的模拟时,我希望实例化复杂的实体。
实体:
class ComplexEntity extends Entity {
public ComplexEntity(){}
}
class SimpleEntity extends Entity {
public SimpleEntity(){}
}
class Entity {
public Entity(){}
}
模拟:
class ComplexSimulation extends Simulation<ComplexEntity>
{
public ComplexSimulation() throws InstantiationException, IllegalAccessException {
super(ComplexEntity.class);
}
}
class SimpleSimulation extends Simulation<SimpleEntity>
{
public SimpleSimulation() throws InstantiationException, IllegalAccessException
{
super(SimpleEntity.class);
}
}
class Simulation<E extends Entity> {
protected final E entity;
public Simulation(Class<E> class1) throws InstantiationException, IllegalAccessException
{
entity = class1.newInstance();
}
}
问题是当我尝试构造一个 ComplexSimulation 时:
ComplexSimulation c = new ComplexSimulation();
我得到以下 InstantiationException:
java.lang.InstantiationException: test.Test$ComplexEntity
at java.lang.Class.newInstance(Unknown Source)
at test.Test$Simulation.<init>(Test.java:55)
at test.Test$ComplexSimulation.<init>(Test.java:37)
at test.Test.go(Test.java:12)
at test.Test.main(Test.java:6)
Caused by: java.lang.NoSuchMethodException: test.Test$ComplexEntity.<init>()
at java.lang.Class.getConstructor0(Unknown Source)
零参数构造函数不是问题,因为我的实体有它们...有人知道问题出在哪里吗?
问题是您使用的是内部 classes。如果没有外部 class 的实例,则无法创建内部 class 的实例,即使您调用 Class<InnerClass>.newInstance()
.
只需将这些内部 classes 设置为顶级 classes 并且您的示例应该按预期工作。
如果你真的want/need使用反射初始化非静态内部classes,请看这里:How to instantiate inner class with reflection in Java?