자바 의 동적 에이전트
1: 피 대리인 (Target. java)
2: 에이전트 (MyProxy. java)
3: 처리 기구 (MyHandler. java)
4: 처리 기구 에 사용 되 는 무기, struts 2 에 대응 하 는 차단기 (Interceptor. java)
코드 는 다음 과 같 습 니 다:
1: 피 대리인 (Target. java)
동적 에이 전 트 는 인터페이스의 기초 위 에 세 워 진 것 이기 때문에 우 리 는 인 터 페 이 스 를 대상 으로 프로 그래 밍 을 해 야 한다.
Interceptor 인터페이스 와 그 실현 클래스
package com.interceptor;
public interface TargetInterface {
public void doSomething();
}
package com.interceptor;
public class Target implements TargetInterface {
public void doSomething() {
System.out.println("do something");
}
}
2: 에이전트 (MyProxy. java)
package com.interceptor;
import java.lang.reflect.Proxy;
public class MyProxy {
public Object getProxy(Object object){
MyHandler myHandler = new MyHandler();
myHandler.setObject(object);
return Proxy.newProxyInstance(object.getClass().getClassLoader(),
object.getClass().getInterfaces(),myHandler);
}
}
3: 처리 기구 (MyHandler. java)
package com.interceptor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyHandler implements InvocationHandler {
private Object object;
private Interceptor interceptor = new Interceptor();
public void setObject(Object object){
this.object = object;
}
public Object invoke(Object arg0, Method arg1, Object[] arg2)
throws Throwable {
Object result = null;
interceptor.before();
result = arg1.invoke(object,arg2);
interceptor.after();
return result;
}
}
4: 처리 기구 에 사용 되 는 무기, struts 2 에 대응 하 는 차단기 (Interceptor. java)
package com.interceptor;
public class Interceptor {
public void before(){
System.out.println("before");
}
public void after(){
System.out.println("after");
}
}
마지막 으로 우리 의 검증 클래스 입 니 다.
package com.interceptor;
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
TargetInterface target = new Target();
// target
MyProxy myProxy = new MyProxy();
TargetInterface proxy =(TargetInterface)myProxy.getProxy(target);
proxy.doSomething();
}
}
처리 프로 세 스 정리:
1: 테스트 클래스 클 라 이언 트 가 실 행 될 때 부터 프 록 시 클래스 에 의 해 계 승 된 인터페이스의 인용 이 되 었 습 니 다.(제 가 이해 하 는 동적 프 록 시 는 인터페이스 프로 그래 밍 과 관련 이 있 습 니 다. 바로 여기에 나타 난 것 입 니 다. 인터페이스 참조 정의)
2: 다음은 프 록 시 대상 (MyProxy myProxy = new MyProxy () 을 정의 합 니 다.) 프 록 시 대상 은 getProxy 방법 을 호출 하고 프 록 시 에 인 용 된 후 (TargetInterface) my Proxy. getProxy (target) 로 전 송 됩 니 다. 프 록 시 클래스 에 의 해 실 현 된 인터페이스 형식 으로 강제로 전 환 됩 니 다.
3: (my Proxy. getProxy (target) 에 깊이 들 어가 세 요.마 이 프 록 시 클래스 중 에
프 록 시 에 의 해 인용 되 는 것 을 보 았 습 니 다. 즉, 이것 (my Proxy. getProxy (target) 의 target 매개 변수 입 니 다.
(my Handler. setObject (object);) 에 의 해 처리 류 MyHandler 에 게 전달 되 었 습 니 다. 다음 네 번 째 는 M 인 H 가 사람 중 에 하 는 동작 을 분 석 했 습 니 다. 먼저 이것 (Proxy. new Proxy Instance (object. getClass (). getClassLoader (), object. getClass (). getInterfaces (), my Handler) 을 말 해 보 세 요.) 대리 류 의 new Proxy Instance 방법 은 무엇 을 하 는 것 입 니까?이 방법 은 MyProxy 대상 을 만 들 때 실례 화 됩 니 다.안에 있 는 세 번 째 인자 my Handler 를 주의 하 세 요.이 매개 변 수 는 우리 가 MyProxy 대상 을 만 들 때 처리 클래스 의 대상 을 전달 했다 는 것 을 설명 합 니 다.
4: 세 번 째 단계 에서 MyProxy 를 만 들 때 myHandler 대상 매개 변 수 를 실례 화 하 는 방법 을 전 달 했 습 니 다.그러면 우 리 는 MyHandler 방법 에 들 어가 서 그것 이 무엇 을 했 는 지 보 자.
너 는 이런 종류의 MyHandler 가 우리 의 주전 장 이라는 것 을 볼 수 있다.
그것 은 무엇 을 했 습 니까?
우선 이 인터페이스 (Invocation Handler) 를 실현 했다. 이 인터페이스 안의 방법 (invoke (Object arg 0, Method arg 1, Object [] arg 2) 이 우리 의 처리 핵심 이다.
invoke 방법 에 있 는 내용 (Object result = null;
interceptor.before();
result = arg1.invoke(object,arg2);
interceptor.after();
return result;)
object 인 스 턴 스 를 실행 하 였 습 니 다. 즉, 클 라 이언 트 에서 proxy 호출 방법 doSomething () 을 참조 하 였 을 때, 실행 방법 doSomething 전에 차단기 Interceptor before 방법 을 호출 하 였 으 며, 실행 후 after 방법 을 호출 하 였 습 니 다.
요약: 처리 라인: Client 는 MyProxy, MyProx 는 MyHandler, MyHandler 는 Interceptor 를 사용 합 니 다. 마지막 으로 우리 의 피 대리 류 Target 은 이렇게 처리 되 었 습 니 다.
위의 네 가지 역할 로 분석 하면 대리인 (Target) 에 의 해 대리 기구 대리 (MyProxy), 대리 기구 가 처리 기 구 를 초빙 하여 처리 하 는 것 (MyHandler) 이 고 처리 기 구 는 무기 (Interceptor) 를 사용 했다.
이상 은 천박한 분석 이 므 로 앞으로 천천히 완 선 될 것 이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.