从动态生成的类中实例化对象

时间:2012-03-30 12:59:40

标签: java reflection instantiation dynamically-generated

我目前正在努力实现以下目标: 基于这个类,我尝试创建类Class的新实例<?扩展AbstractValidator>由getValidator()方法返回。

public abstract class AbstractEnumDefinition
       extends AbstractRequestFieldDefinition {

    private Vector<String> values = new Vector<String>();

    public abstract void define(String lang);

    protected void addEnumDefinition(String value){
        values.add(value);
    }

    public Vector<String> getValues(){
        return values;
    }

    @Override
    public Class<? extends AbstractValidator> getValidator() {
        return new AbstractValidator() {
            @Override
            public boolean isValid(String value) {
                return values.contains(value);
            }

            @Override
            public String getDefaultValue() {
                return "";
            }
        }.getClass();
    }
}

说我创建这个类:

public class LanguageDefinition extends AbstractEnumDefinition {

    public LanguageDefinition() {
        super();
    }

    @Override
    public void define(String language) {
        addEnumDefinition("BEL-fr");
        addEnumDefinition("BEL-nl");
        addEnumDefinition("BEL-en");
    }
}

稍后在我的代码中,我打电话给

new LanguageDefinition().getValidator().getConstructor().newInstance()

我试图在这里实例化的类没有在任何地方声明,而是在AbstractEnumDefinition类中“动态生成”/“动态创建”。

尝试执行此操作时,我会得到java.lang.InstantiationException

be....servlets.model.extraction.filter.editor.AbstractEnumDefinition$1

我想这是因为这个类必须事先明确创建,而不是动态引用?

是否有某种解决方案可以让我不必为每个验证器编写一个类?

感谢您的帮助,

埃里克

2 个答案:

答案 0 :(得分:2)

我只能做出假设,因为我没有看到您实际使用该类的代码,但您应该检查:http://docs.oracle.com/javase/6/docs/api/java/lang/InstantiationException.html

它提到的一件事是实例化可能失败的是类是一个抽象类(完全符合逻辑,因为你无法实例化抽象类)。

另外,我不明白为什么你需要返回类然后创建和对象。为什么不定义Validator接口并让您的方法返回Validator对象。

答案 1 :(得分:1)

据我所知,这对匿名类不起作用,你必须将你的类转换为命名的内部类:

但即使这样也行不通,因为你可能没有默认的构造函数。内部类获取隐式构造函数参数以保持对封闭类的引用。不幸的是,闭包在静态语言中不能很好地工作。

总之,非静态的内部类不能在封闭类的实例之外实例化。