먼저 에이전트가 무엇인지 소개하겠습니다.
(동영상 공유 학습: java 동영상 튜토리얼)
Proxy는 디자인 패턴이며 핵심 아이디어는 대상에 대한 액세스를 프록시 객체로 전송하는 것입니다. 이것의 장점은 대상 객체가 코드를 변경하지 않고도 프록시 객체를 통해 몇 가지 추가 기능을 추가할 수 있다는 것입니다. 이는 원본 코드를 변경하지 않고 에이전트를 통해 일부 확장 기능을 추가하는 프로그래밍 아이디어입니다.
프록시 프로세스는 그림과 같으며, 프록시 객체는 대상 객체에 액세스하여 사용자가 대상 객체에 액세스하는 목적을 달성합니다. 세 가지 역할:
ISubject: 인터페이스 개체, 이 인터페이스는 개체와 해당 프록시가 공유하는 인터페이스입니다.
TargetSubject: 대상 개체는 추상 테마 인터페이스를 구현하는 클래스입니다. Proxy: 실제 개체를 조작할 수 있도록 대상 개체 TargetSubject에 대한 참조가 포함된 프록시 역할입니다. 프록시 객체는 대상 객체와 동일한 인터페이스를 제공하므로 언제든지 대상 객체를 대체할 수 있습니다. 동시에 프록시 개체는 대상 개체에 대한 작업을 수행할 때 다른 작업을 추가할 수 있으며 이는 실제 개체를 캡슐화하는 것과 같습니다. 일반적인 프록시 모드는 정적 프록시와 동적 프록시로 구분됩니다. Java에서 동적 프록시 구현은 JDK 동적 프록시와 cglib 프록시로 구분됩니다. Static Proxy앞서 언급한 것처럼 프록시 모드에는 세 가지 역할이 있습니다. 하나는 대상 인터페이스이고, 두 번째는 대상 객체이고, 세 번째는 프록시 객체입니다. 이제는 특정 코드로 구현됩니다. 먼저 대상 인터페이스는 다음과 같습니다.public interface IBlogService { void writeBlog(); }
public class BlogService implements IBlogService { @Override public void writeBlog() { System.out.println("i'm writing..."); } }
public class BlogStaticProxy implements IBlogService{ private IBlogService blogService; public BlogStaticProxy(IBlogService blogService) { this.blogService = blogService; } @Override public void writeBlog() { System.out.println("start writing..."); blogService.writeBlog(); System.out.println("end writing..."); } }
public class BlogStaticProxy implements IBlogService{ private IBlogService blogService; public BlogStaticProxy(IBlogService blogService) { this.blogService = blogService; } @Override public void writeBlog() { System.out.println("start writing..."); blogService.writeBlog(); System.out.println("end writing..."); } }
public class TestStaticProxy { public static void main(String[] args) { IBlogService target = new BlogService(); BlogStaticProxy proxy = new BlogStaticProxy(target); proxy.write(); } }
start writing… i’m writing… end writing…
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException { }
public class JdkBlogProxyFactory { private Object target; public JdkBlogProxyFactory(Object target) { this.target = target; } public Object newInstance() { return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), (proxy, method, args) -> { System.out.println("start writing"); Object o = method.invoke(target, args); System.out.println("end writing"); return o; }); } }
public class TestJdkProxy { public static void main(String[] args) { IBlogService target = new BlogService(); System.out.println(target.getClass()); // 给目标对象,创建代理对象 IBlogService proxy = (IBlogService) new JdkBlogProxyFactory(target).newInstance(); // class $Proxy0 内存中动态生成的代理对象 System.out.println(proxy.getClass()); // 执行方法 【代理对象】 proxy.writeBlog(); } }
class com.forezp.proxy.BlogService class com.sun.proxy.$Proxy0 start writing i'm writing... end writing
public class CglibBlogFactory implements MethodInterceptor { private Object target; public CglibBlogFactory(Object target) { this.target = target; } //给目标对象创建一个代理对象 public Object getProxyInstance() { //1.工具类 Enhancer en = new Enhancer(); //2.设置父类 en.setSuperclass(target.getClass()); //3.设置回调函数 en.setCallback(this); //4.创建子类(代理对象) return en.create(); } @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("start writing..."); //执行目标对象的方法 Object returnValue = method.invoke(target, objects); System.out.println("end writing..."); return returnValue; } }
public class TestCglib { public static void main(String[] args) { IBlogService target = new BlogService(); //代理对象 IBlogService proxy = (IBlogService) new CglibBlogFactory(target).getProxyInstance(); //执行代理对象的方法 proxy.writeBlog(); } }
start writing... i'm writing... end writing...
java 소개 튜토리얼
위 내용은 Java 프록시 모드 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!