2017-02-03 4 views
0

У меня есть два вопроса, которые имеют отношение.Изменение декларации и строительство объекта в JAVA

Первый вопрос, если есть какой-то подход объявить реализацию интерфейса в Java во время выполнения, чтобы избежать следующей ошибки:

IObject obj = new Object(); 

Объект Объект не реализует интерфейс IObject ,

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

Исходный код, который я хочу изменить это:

Object obj = new Object(); 

Целевой объект, который я хочу, чтобы достичь является следующий:

IObject objProxy = (IObject) ProxyFactory.generateProxy(new Object()); 

Большое спасибо

ответ

2

You может менять классы в Java-программе. Тем не менее, вам нужно будет применить изменения во время сборки и до запуска вашей программы. Это ограничивает вас классами, которые вы определяете, и исключает любые классы JVM, которые не являются частью вашего артефакта.

Одним из возможных подходов было бы использовать Byte Buddy, который предлагает механизм для записи Plugin s, которые запускаются при сборке.

Приведенный выше код показывает, как реализовать IObject для любого класса с именем pkg.Object:

public class SimplePlugin implements Plugin { 
    @Override 
    public boolean matches(TypeDescription target) { 
    return target.getName().equals("pkg.Object"); 
    } 
    @Override 
    public DynamicType.Builder<?> apply(
    DynamicType.Builder<?> builder, 
    TypeDescription typeDescription 
) { 
    return builder.implement(IObject.class); 
    } 
} 

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

<plugin> 
    <groupId>net.bytebuddy</groupId> 
    <artifactId>byte-buddy-maven-plugin</artifactId> 
    <executions> 
    <execution> 
     <goals> 
     <goal>transform</goal> 
     </goals> 
    </execution> 
    </executions> 
    <configuration> 
    <transformations> 
     <transformation> 
     <plugin>pkg.SimplePlugin</plugin> 
     </transformation> 
    </transformations> 
    </configuration> 
</plugin> 

Что касается заменив конструкцию объекта, вам нужно будет изменить байтовый код класса. Вам нужно будет обнаружить любую инструкцию, которая создает экземпляр вашего класса и заменяет его фабричным вызовом. Вы можете сделать это, используя ASM, который открывается Byte Buddy через AsmVisitorWrapper.

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