Java 정적 에이전트 및 동적 에이전트 요약
첫 번째 구현(인터페이스 기반):
1 인터페이스
public interface Hello {
void say(String msg);
}
2> 목표 클래스, 최소한 하나의 인터페이스 구현
public class HelloImpl implements Hello {
public void say(String msg) {
System.out.println("Hi,"+msg);
}
}
3) 프록시 클래스(목표 클래스와 동일한 인터페이스를 실현하여 기능의 일치를 확보)
public class HelloProxy implements Hello{
private Hello hello;
public HelloProxy(Hello hello){
this.hello = hello;
}
public void say(String msg){
before();
hello.say(msg);
after();
}
private void before(){
System.out.println("Before");
}
private void after(){
System.out.println("After");
}
}
3 테스트
/**
* @Author LZHL
* @Create 2017-02-19 10:26
* @Description
*/
public class Main {
public static void main(String[] args) throws Exception {
HelloImpl target = new HelloImpl();
HelloProxy proxy = new HelloProxy(target);
proxy.say("LZHL");
}
}
두 번째 구현 (목표 클래스 기반):1> 대상 클래스
public class HelloTarget {
public void sayHello(String name){
System.out.println("Hi,"+name);
}
}
2>프록시 클래스(타겟 클래스를 계승하여 기능 일치 보장)
public class HelloProxy extends HelloTarget{
private HelloTarget target;
public HelloProxy(HelloTarget target){
this.target = target;
}
@Override
public void sayHello(String name) {
this.before();
target.sayHello(name);
this.after();
}
private void before(){
System.out.println("Before");
}
private void after(){
System.out.println("After");
}
}
3 > 테스트
public class Main {
public static void main(String[] args) throws Exception {
HelloTarget target = new HelloTarget();
HelloProxy proxy= new HelloProxy(target);
proxy.sayHello("LZHL");
}
}
동적 에이전트동적 에이전트의 에이전트 클래스는 프로그램이 실행되는 동안 동적으로 생성되며 두 가지 실현도 있다. 하나는 JDK 동적 에이전트이고 하나는 CGLib 동적 에이전트이다.
1 JDK 동적 에이전트(인터페이스 기반 구현, 목표 클래스와 동일한 인터페이스 구현, 기능 일치 보장)
/**
* @Author LZHL
* @Create 2017-02-19 12:46
* @Description
*/
public class Main {
public static void main(String[] args){
final HelloImpl target = new HelloImpl();
Object proxyInstance = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
/*
* proxy:
* method:
* args:
* return:
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before");
Object retValue = method.invoke(target, args);
System.out.println("after");
return retValue;
}
});
Hello proxy = (Hello) proxyInstance;
proxy.say("LYX");
// InvocationHandler , , ,
class JDKProxy implements InvocationHandler {
private Object target;
public JDKProxy(Object target){
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
Object result = method.invoke(target, args);
after();
return result;
}
private void before(){
System.out.println("Before");
}
private void after(){
System.out.println("After");
}
}
InvocationHandler ih = new JDKProxy(target);
Object proxyInstance2 = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), ih);
Hello proxy2 = (Hello) proxyInstance2;
proxy2.say("LZHL");
}
}
2. CGLib 동적 에이전트(목표 클래스를 바탕으로 목표 클래스를 계승하여 기능이 일치하도록 보장), cglib-3.2.4를 가져와야 한다.jar 가방pom.xml
<dependencies>
<!-- https://mvnrepository.com/artifact/cglib/cglib -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.2.4</version>
</dependency>
</dependencies>
1) 대상 클래스
public class Hi {
public void sayHi(String msg){
System.out.println("Hi,"+msg);
}
}
2) 테스트
/**
* @Author LZHL
* @Create 2017-02-19 13:19
* @Description
*/
public class Main {
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
//
enhancer.setSuperclass(Hi.class);
//
enhancer.setCallback(new MethodInterceptor() {
public Object intercept(Object target, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
System.out.println("before");
Object retValue = methodProxy.invokeSuper(target, args);
System.out.println("after");
return retValue;
}
});
Object proxy = enhancer.create();
Hi hi = (Hi) proxy;
hi.sayHi("LXY");
// MethodInterceptor , , ,
class CGLibProxy implements MethodInterceptor {
public <T> T getProxy(Class<T> clazz){
return (T) Enhancer.create(clazz, this);
}
public Object intercept(Object target, Method method, Object[] args, MethodProxy proxy) throws Throwable {
before();
Object result = proxy.invokeSuper(target, args);
after();
return result;
}
private void before(){
System.out.println("Before");
}
private void after(){
System.out.println("After");
}
}
CGLibProxy cgLibProxy = new CGLibProxy();
Hi hi2 = cgLibProxy.getProxy(Hi.class);
hi2.sayHi("LZHL");
}
}
위에서 말한 것은 편집자가 여러분께 소개한 자바 정적 에이전트와 동적 에이전트의 총결산입니다. 여러분께 도움이 되었으면 합니다. 만약에 궁금한 점이 있으면 저에게 메시지를 남겨 주시면 편집자는 제때에 답장을 드리겠습니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
38. Java의 Leetcode 솔루션텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.