2013-07-04 1 views
-1

RMI를 통해 통신하는 클라이언트 및 서버 구성 요소를 개발해야합니다.동적 RMI 메서드 생성

public interface Test { 
    public String getInformation(); 
} 

public class TestImpl implements Test { 

    public String getInformation() { 
     return “Hello”; 
    } 
} 

이 테스트 인터페이스는 RMI 클라이언트 측에서하지만,이 테스트 인터페이스와 TestImpl 클래스하지만 이러한 모든 클래스 이름, 메소드 이름, 매개 변수, 반환 형식은 메타 데이터로 사용할 수 있습니다 사용할 수 없습니다 RMI 서버에서 실행하는 데 사용할 수 있습니다 (저장 DB에 있음). 나는 사실상 Test와 TestImpl 클래스를 생성하여 RMI 서버에 주입 할 필요가있다. 어떻게해야합니까? 당신이, 클래스 이름, 메서드 이름, 매개 변수 유형에서 RMI의 서버 클래스를 생성 등의 형태를 돌려 하려면

+0

의존성 주입 엔진으로 Spring을 사용해 보자. 당신은 많은 바퀴를 여기에서 재발 명했습니다. – duffymo

+0

정의하십시오. '동적 RMI 메소드 생성'을 정의하십시오. '가상으로 생성'을 정의하십시오. 존재하지 않는 서비스를 테스트해야하는 이유를 정의하십시오. – EJP

답변

0

중 하나를 DB에 저장 또는 어떻게 든 다른, 당신은 몇 가지 잘 알려진 바이트 코드 계측 도구를 사용할 수 있습니다 ASM (가장 많이 사용됨), Javassist 또는 BCEL (임베디드 버전은 버전 1.5 이상부터 JDK에서도 사용할 수 있음). ("가상"세대의 의미와 "가상"클래스 생성과 "가상이 아닌"클래스 생성의 차이는 무엇입니까?) 주입, 당신은 생성 된 클래스의 인스턴스의 here 같은 java.rmi.registry.Registry의와 등록을 의미하는 경우 사소한와 다른 RMI 서버의 "주입"다르지 않다. 보조 노트로

: 그것은 당신이 상당히 특이한 디자인이 보인다. 클래스 이름, 메서드 이름 등을 DB에 저장하는 것이 한 가지입니다. 또 다른 하나는 클라이언트 측에서이 모든 정보가 정의되는 반면 다른면에서는 일반적으로 정의된다는 것입니다. 어쨌든,이 디자인으로 가야한다면 옵션으로 DB에 클래스 이름, 메소드 이름 등의 텍스트 정의 대신 .class 파일의 컴파일 된 (바이너리) 형식으로 저장하는 것을 고려할 수 있습니다. 이 경우에는 바이트 코드 생성을 망칠 필요가 없으며 일반 자바 리플렉션 Proxy/InvocationHandler를 사용할 수도 있고 최악의 경우 간단한 CGLIB 프록시를 사용할 수도 있습니다.