자바 에이전트 모드(정적 에이전트,동적 에이전트,cglib 에이전트)
프 록 시 모드(Proxy Pattern)는 구조 적 모드 이다.프 록 시 모드 는 대상 에 대한 접근 을 제어 하기 위해 대역 을 제공 합 니 다.즉,대리 대상 을 통 해 목표 대상 에 접근 하면 목표 대상 이 실현 되 는 토대 에서 추가 적 인 기능 조작 을 강화 할 수 있다.즉,목표 대상 의 기능 을 확장 하 는 것 이다.
프 록 시 대상 은 원 격 대상,씀 씀 이 응답 대상 을 만 들 거나 안전 통제 대상 이 필요 할 수 있 습 니 다.프 록 시 모드 는 주로 세 가지 형식 이 있 는데 그것 이 바로 정적 프 록 시,동적 프 록 시(JDK 프 록 시,인터페이스 프 록 시 라 고도 함)와 cglib 프 록 시(메모리 동적 생 성 대상 에서 인 터 페 이 스 를 실현 하지 않 아 도 동적 프 록 시 범주 에 속 할 수 있 음)이다.
아 날로 그:
정적 에이전트
정적 대 리 는 부모 클래스 나 인 터 페 이 스 를 정의 한 다음 에 대리 대상(즉 목표 대상)과 대리 대상 이 함께 같은 인 터 페 이 스 를 실현 하거나 같은 부모 클래스 를 계승 하 는 것 입 니 다.대리 대상 과 목표 대상 이 같은 인 터 페 이 스 를 실현 한 후 같은 방법 으로 목표 대상 을 호출 하 는 방법.
인터페이스
public interface ITeacherDao {
void teach(); //
}
피 대리 대상
public class TeacherDao implements ITeacherDao {
@Override
public void teach() {
System.out.println(" ");
}
}
대리 대상
public class TeacherDaoProxy implements ITeacherDao {
private ITeacherDao target; //
public TeacherDaoProxy(ITeacherDao target) {
this.target = target;
}
@Override
public void teach() { //
System.out.println(" ");
target.teach();
System.out.println(" ");
}
}
테스트
public class Client {
public static void main(String[] args) {
//
TeacherDao teacherDao = new TeacherDao();
// ,
TeacherDaoProxy teacherDaoProxy = new TeacherDaoProxy(teacherDao);
// ,
teacherDaoProxy.teach();
}
}
/* :
*/
동적 에이전트동적 에이전트 도 JDK 에이전트,인터페이스 에이전트 라 고 합 니 다.프 록 시 대상 이 인 터 페 이 스 를 실현 할 필요 가 없 도록 합 니 다(단,대상 이 인 터 페 이 스 를 실현 하려 면).프 록 시 대상 의 생 성 은 JDK 의 API 를 이용 하여 메모리 에 프 록 시 대상 을 동적 으로 구축 합 니 다.
즉,JDK 패키지
java.lang.reflect.Proxy
중의newProxyInstance
방법 을 사용 하여 대상(피 에이전트 대상)을 동적 으로 만 듭 니 다.이 방법 은 다음 과 같이 세 개의 인 자 를 받 아야 합 니 다.1.ClassLoader loader 는 현재 대상 이 사용 할 클래스 로 더 를 지정 합 니 다.
2.Class[] 인터페이스 대상 이 실현 하 는 인터페이스 유형 은 일반적인 방법 으로 유형 을 확인 합 니 다.
3.InvocationHandler h 일 처리,대상 의 방법 을 실행 할 때,현재 실행 중인 대상 방법 을 매개 변수 로 전송 합 니 다.
static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h )
아 날로 그:핵심 은
getProxyInstacne()
인터페이스
public interface ITeacherDao {
void teach();
void tesst(String name);
}
목표 대상
public class TeacherDao implements ITeacherDao {
@Override
public void teach() {
System.out.println(" ");
}
@Override
public void tesst(String name) {
System.out.println(" :" + name);
}
}
대리 대상
public class ProxyFactory {
// , Object
private Object target;
// , target
public ProxyFactory(Object target) {
this.target = target;
}
//
public Object getProxyInstance() {
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler() { // invoke
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(" ");
Object returnVal = method.invoke(target, args);//
System.out.println(" ");
return returnVal;
}
});
}
}
테스트
public class Client {
public static void main(String[] args) {
//
ITeacherDao target = new TeacherDao();
//
ITeacherDao proxyInstance = (ITeacherDao)new ProxyFactory(target).getProxyInstance();
//
System.out.println(proxyInstance.getClass());
// ,
proxyInstance.teach();
proxyInstance.tesst(" ");
}
}
/* :
:
*/
cglib 에이전트Cglib 대 리 는 하위 에이전트 라 고도 부 릅 니 다.목표 대상 이 인 터 페 이 스 를 실현 하지 않 아 도 되 고 메모리 에 하위 대상 을 구축 하여 목표 대상 에 대한 기능 확장 을 실현 합 니 다.어떤 것 은 Cglib 대 리 를 동적 에이전트 에 귀속 시 킵 니 다.
Cglib 는 고성능 코드 생 성 패키지 로 실행 기간 에 자바 류 를 확장 하고 자바 인 터 페 이 스 를 실현 할 수 있 습 니 다.많은 AOP 프레임 워 크 에 사 용 됩 니 다(예 를 들 어 Spring AOP).cglib 패키지 의 밑바닥 은 바이트 코드 처리 프레임 ASM 을 사용 하여 바이트 코드 를 변환 하고 새로운 클래스 를 생 성 합 니 다.
특히 주의:프 록 시 클래스 는 final 이 될 수 없습니다.그렇지 않 으 면 오류
java.lang.IllegalArgumentException
를 보고 할 수 없습니다.대상 의 방법 이 final 이나 static 이면 차단 되 지 않 습 니 다(즉,대상 의 추가 업무 방법 을 실행 하지 않 습 니 다).cglib 패키지 추가:아래 jar 패 키 지 를 다운로드 하여 프로젝트 에 복사 한 다음
add to library
오른쪽 단 추 를 누 르 십시오.다른 것 은 대리 대상 이
MethodInterceptor
인 터 페 이 스 를 실현 하고intercept()
방법 을 재 작성 하여 피 대리 대상(대상)에 대한 방법 을 호출 하 는 것 입 니 다.코드:
목표 대상
public class TeacherDao {
public String teach() {
System.out.println(" ");
return " ";
}
}
대리 대상
public class ProxyFactory implements MethodInterceptor {
//
private Object target;
public ProxyFactory(Object target) {
this.target = target;
}
// target
public Object getProxyInstance() {
//
Enhancer enhancer = new Enhancer();
//
enhancer.setSuperclass(target.getClass());
//
enhancer.setCallback(this);
// ,
return enhancer.create();
}
// intercept ,
@Override
public Object intercept(Object arg0, Method method, Object[] args, MethodProxy arg3) throws Throwable {
System.out.println("Cglib ");
Object returnVal = method.invoke(target, args);
System.out.println("Cglib ");
return returnVal;
}
}
테스트
public class Client {
public static void main(String[] args) {
//
TeacherDao target = new TeacherDao();
// ,
TeacherDao proxyInstance = (TeacherDao)new ProxyFactory(target).getProxyInstance();
// , intecept ,
proxyInstance.teach();
System.out.println(res);
}
}
/* :
Cglib
Cglib
*/
활용 단어 참조이 글 은 여기까지 입 니 다.당신 에 게 도움 을 줄 수 있 기 를 바 랍 니 다.또한 당신 이 우리 의 더 많은 내용 에 관심 을 가 져 주 실 수 있 기 를 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.