2017-02-03 4 views
0

관계가있는 두 가지 질문이 있습니다.자바에서 객체 선언 및 변경 변경

IObject obj = new Object(); 

개체 개체 인터페이스 IObject를 구현하지 않습니다 다음 오류를 방지하기 위해 실행 시간 동안 자바 인터페이스의 구현을 선언하는 몇 가지 방법이 있다면

첫 번째 질문은 .

두 번째 질문은 프록시를 만들기 위해 java에서 객체의 선언 및 구성을 변경하고자합니다. 다음은 예제를 볼 수 있습니다.

내가 변경하려면 소스 코드는 다음과 같습니다

Object obj = new Object(); 

내가 도달하고자하는 목표 객체는 다음 중 하나입니다 :

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

당신에게 대단히 감사합니다

답변

2

당신에게 Java 프로그램에서 클래스를 변경할 수 있습니다. 그러나 빌드 및 프로그램을 실행하기 전에 변경 사항을 적용해야합니다. 이로 인해 이슈의 일부가 아닌 JVM 클래스를 정의하고 제외하는 클래스로 제한됩니다.

가능한 접근 방법 중 하나는 Byte Buddy을 사용하여 빌드시 트리거되는 Plugin을 작성하는 메커니즘을 제공하는 것입니다. 당신은 플러그인을 활성화 할 수 있습니다

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); 
    } 
} 

은 메이븐 동안 실행되는 다음으로 구축 : 관해서

<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> 

위의 코드는 pkg.Object를라는 이름의 클래스 IObject 구현하는 방법을 보여줍니다 객체의 구성을 바꾸면 클래스의 바이트 코드를 변경해야합니다. 클래스의 인스턴스를 생성하고 팩토리 호출로 대체하는 명령어를 감지해야합니다. AsmVisitorWrapper을 통해 Byte Buddy에 노출 된 ASM을 사용하여 그렇게 할 수 있습니다.