2011-02-24 2 views
3

Я хотел бы иметь возможность реализовать метод во время выполнения, который вызывается до того, как объект запускает инициализаторы. Это позволит мне устанавливать поля, которые используются во время инициализации.Возможно ли создать анонимный класс при использовании отражения?

Вот пример:

class A { 
    public A() { 
    initialize(); 
    } 
    public void initialize() { } 
} 

class B extends A { 
    public String message; 
    { 
    System.out.println(message); 
    } 
} 

public class MainClass { 
    public static void main(final String[] args) throws Exception { 

    Class<A> aClass = (Class<A>)Class.forName(args[0]); 
    // what's next in order to something like this even though 
    // I don't know what subclass of A was passed in as an 
    // argument above 
    A a = aClass.newInstance() 
    { 
     public void initialize() { 
     this.message = args[1]; 
     } 
    }; 
    } 
} 

Я, вероятно, в конечном итоге, используя аспекты, но я хотел бы знать, если есть чистый Java путь.

ответ

1

ли вы имеете в виду что-то вроде этого, предполагая, что будет составлять (который не делает):

@Override 
A a = aClass.newInstance() 
{ 
    public void initialize() { 
     this.message = args[1]; 
     } 
}; 
+0

yes ............... – Matt

+0

обновил мой вопрос с помощью вашего редактирования. ... спасибо – Matt

0

Похоже, что вы хотите, это Dynamic Proxies, которые были доступны с Java 1.3.

Edit: Я посмотрел в mockito, чтобы увидеть, как им удалось издеваться конкретных классов и выясняется, что они создают байт-код, а затем загрузить его с загрузчиком класса. Мало того, что это действительно не то, что вы хотите, но оно сложнее, чем нужно.

Я согласен с Стивеном C: Почему вы хотите это сделать? Я подозреваю, что может быть более простой способ. Я подозреваю, что может работать лучше для вас, это шаблон Strategy или Command. В этом случае пользовательский код находится в своем собственном маленьком классе:

public class Initializer<A> { 

    public (abstract) void initialize(A parent); 
} 

final String args[] = ...; 
Initializer<A> initializer = new Initializer<A>() { 
    public void initialize(A parent) { 
     parent.setMessage(args); 
    } 
}; 

который либо назначен главным класс или обертывание основного класса (в зависимости от необходимости).

+0

Я не уверен, как я мог реализовать это, поскольку интерфейсы реализации proxies. Мне нужно реализовать метод класса в моем случае. Не могли бы Вы уточнить? – Matt

+0

Следующим шагом будет просмотр кода mockito (http://mockito.org/), поскольку у них есть код для издевательства над конкретными классами, который похож на то, что вы хотите. Я могу помочь с этим в выходные. –

+0

@Matt Посмотреть мои правки выше –

0

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

Динамические прокси могут ... если вы пытались реализовать динамически загруженный интерфейс.

Единственные другие подходы, которые я могу придумать, - использовать BCEL или генерацию/компиляцию динамического исходного кода. И оба будут очень сложными. И не считаются чистой Java.

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

+0

Я запускаю методы в инициализаторах, которые требуют инициализации полей до запуска инициализаторов. Концептуальным является то, что я загружаю представление, логика представления находится в инициализаторе, и я хотел бы установить атрибуты модели до создания представления. – Matt

Смежные вопросы