에이전트 모드 의 jdk 동적 에이전트 구현
4178 단어 디자인 모드
//
public interface ProxyInterface {
public void say(String str);
}
//
public class ProxyImpl implements ProxyInterface {
@Override
public void say(String str) {
System.out.println("ProxyImpl.say is " +str);
}
}
//
public class ProxyClass implements InvocationHandler {
Object o;
public void setTarget(Object o){
this.o = o;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(" ");
method.invoke(o,args);
System.out.println(" ");
return null;
}
}
//
// jdk
public static void main(String[] args) {
ProxyInterface proxyInterface = new ProxyImpl();
ProxyClass proxyClass = new ProxyClass();
proxyClass.setTarget(proxyInterface);
//
ProxyInterface proxy = (ProxyInterface)Proxy.newProxyInstance(proxyInterface.getClass().getClassLoader(),proxyInterface.getClass().getInterfaces(),proxyClass);
System.out.println("------------------------------------------");
proxy.say("hello");
System.out.println(proxy.getClass().getName());
System.out.println(proxyInterface.getClass().getName());
}
결과: D: \ developmenttool\jdk1.8.0_181\bin\java.exe
호출 방법 전에 실행 되 는 방법 ProxyImpl. say is hello 가 호출 방법 후에 실행 되 는 동작 com. sun. proxy. $Proxy 0 / / 이것 은 jdk 에서 생 성 된 에이전트 클래스 com. test. Proxy. ProxyImpl / / / 이것 은 에이전트 클래스 입 니 다.
Process finished with exit code 0
설명: 프 록 시 클래스 ProxyClass 는 인터페이스 Invocation Handler 를 실현 하고 그 안의 방법 을 다시 써 야 합 니 다 @ Override Public Object invoke (Object proxy, Method method, Object [] args) throws Throwable {System. out. println ("호출 방법 전에 실행 하 는 방법"), method. invoke (o, args), System. out. println ("호출 방법 후에 실행 하 는 작업"), return null;}
그 중에서 method. invoke (o, args);첫 번 째 매개 변 수 를 제외 하고 나머지 는 고정 쓰기 입 니 다. 첫 번 째 매개 변 수 는 우리 가 대리 해 야 할 실현 류 가 method. invoke (o, args) 에 있 습 니 다.이전에 우리 가 추가 한 방법 이나 코드 는 대리 되 는 방법 전에 method. invoke (o, args) 에서 실 행 됩 니 다.그 다음 에 저희 가 추가 한 방법 이나 코드 는 대리 되 는 방법 후에 실 행 됩 니 다.
동적 대 리 는 정적 대리 의 단점 을 해결 하기 위해 탄생 한 것 이기 때문에 우 리 는 동적 대리 와 정적 대리 의 차이 점 을 알 아야 한다. 동적 대 리 는 우리 가 직접 대리 류 를 쓸 필요 가 없다. 상기 프 록 시 클래스 는 우리 가 대리 류 라 고 말 하 는 것 은 쓰기 방법 이 다 르 기 때문에 프 록 시 클래스 를 쓰 지 않 는 다 고 가정 하기 때문이다. 우 리 는 이렇게 동적 대 리 를 실현 할 수 있다.
public static void main(String[] args) {
ProxyInterface proxyInterface = new ProxyImpl();
ProxyInterface proxy = (ProxyInterface)Proxy.newProxyInstance(
proxyInterface.getClass().getClassLoader(),
proxyInterface.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(" ");
method.invoke(proxyInterface,args);
System.out.println(" ");
return null;
}
});
proxy.say(" ");
}
//
ProxyImpl.say is
Process finished with exit code 0
첫 번 째 쓰 기 는 Invocation Handler 인터페이스의 실현 을 쓰 는 것 에 불과 하 다. 두 번 째 는 사용 할 때 Invocation Handler 인 터 페 이 스 를 실현 하 는 것 이다. 아무리 써 도 우 리 는 첫 번 째 쓰 기 를 예 로 들 면 두 가 지 를 발견 할 수 있다.
요약 하면 동적 에이전트 가 정적 대 리 를 미리 작성 하 는 절 차 를 jdk 에 게 맡 겨 컴 파일 할 때 생 성 되 기 때문에 정적 에이전트 의 단점 을 피 할 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.