Создание объекта из динамически сгенерированного класса - PullRequest
3 голосов
/ 30 марта 2012

В настоящее время я пытаюсь достичь чего-то подобного: На основе этого класса я пытаюсь создать новый экземпляр класса Class.возвращается методом 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 ]

2 голосов
/ 30 марта 2012

Я могу только делать предположения, так как не вижу кода, где вы на самом деле используете класс, но вы должны проверить: http://docs.oracle.com/javase/6/docs/api/java/lang/InstantiationException.html

Одна вещь, которую он упоминает, это то, что создание экземпляров может завершиться неудачей, это класс абстрактный класс (совершенно логичный, поскольку вы не можете создавать экземпляры абстрактных классов).

Кроме того, я не понимаю, почему вам нужно возвращать класс, а затем создавать и возражать. Почему бы просто не определить интерфейс Validator и заставить ваш метод возвращать объект Validator.

1 голос
/ 30 марта 2012

Насколько я знаю, это не работает для анонимных классов, вы должны преобразовать свой класс в именованный внутренний класс:

Но даже это не будет работать должным образом, потому что у вас может не быть конструктора по умолчанию. Внутренние классы получают неявные аргументы конструктора, чтобы сохранить ссылку на включающий класс. К сожалению, замыкания не очень хорошо работают на статических языках.

В итоге, внутренние классы, которые не являются статичными, не могут быть созданы вне экземпляра включающего класса.

...