2012-03-30 90 views
3

我目前正试图实现如下目标: 基于这个类,我尝试创建一个新的类类实例<?扩展方法getValidator()返回的AbstractValidator>。从动态生成的类中实例化一个对象

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 

我想这是由于这一类必须事先明确创建,而不是动态引用的事实呢?

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

感谢您的帮助,

埃里克

+0

你是什么意思*动态创建类*?我们不确定我们是否了解您。 – adarshr 2012-03-30 13:05:15

+0

可能缺少no-param构造函数,导致getInstance()失败。这意味着无法通过反射实例化无法实现的类。 – yggdraa 2012-03-30 13:12:52

+0

刚刚更新了问题,澄清了事情。谢谢。 – efj 2012-03-30 13:14:41

回答

2

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

一它提到的事情是实例化可能会失败是该类是一个抽象类(完全合乎逻辑,因为你不能实例化抽象类)。

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

+0

你的假设是正确的。我有一个疯狂的希望,这可能实际上工作,因为它确实是一个抽象的,但在代码中定义的类。如果可能的话,我想避免在此范围内创建实际的对象,只使用类引用和按需实例化。无论如何,你的解决方案当然会起作用,我相信这将是我唯一的选择。感谢您的回复。 – efj 2012-03-30 13:37:14

1

这并不匿名类的工作,据我所知,你有你的类转换为命名的内部类:

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

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

+0

同意。我有一个疯狂的希望,这可能实际上工作。 事实上,即使使用默认的构造函数,实例化内部类也是行不通的,至少我希望它有可能。 感谢您的帮助。 – efj 2012-03-30 13:25:21