Вывод класса на лету - Шаблон посетителя - PullRequest
2 голосов
/ 03 февраля 2011

Я хотел бы создать шаблон посетителя таким образом

public interface Visitable<T>{
   public void accept(T visitor);
}

public interface SomeBusinessService implements Visitable<SomeVisitor>{

  public void mtd1();
  public void mtd2();
}

public abstract class SomeBusinessBean1 implements SomeBusinessService {
   public void mtd1(){}
   public void mtd2(){}
} 

public abstract class SomeBusinessBean2 implements SomeBusinessService {
   ...
}

и т. Д.

тогда я бы хотел создать фабрику

public class SomeBusinessServiceFactory {
   public SomeBusinessService createService
                 (Class<? extends SomeBusinessService> clazz ){
      //do some stuff to create appropriate class derivation on the fly
     // that will have accept() method implemented 
   }
}

и я мог бы вызвать его следующим образом

SomeBusinessService  service = 
    SomeBusinessServiceFactory.createService(SomeBusinessBean1.class);

При таком подходе мне не пришлось бы создавать абстрактный класс comman для всех bean-компонентов, которые реализовать метод accept () интерфейса Visitor.

Это решение может также использоваться в ситуациях, когда нам хотелось бы иметь общее поведение определенных методов в зависимости от фабрики сервисов для иерархии классов.

Есть ли способ сделать это с помощью стандартного jdk, или, может быть, мне нужно использовать внешние инструменты, такие как cglib, или, может быть, то, что я говорю, является мусором, и мы можем достичь этой цели другим способом.

Tx в продвинутом

1 Ответ

0 голосов
/ 03 февраля 2011

Если вы ищете способ создания экземпляра класса из его объекта класса, взгляните на API отражения Java.

clazz.newInstanze();

или

clazz.getConstructors(...).newInstance(...);
...