먼저 에이전트가 무엇인지 소개하겠습니다.
(동영상 공유 학습: java 동영상 튜토리얼)
Proxy는 디자인 패턴이며 핵심 아이디어는 대상에 대한 액세스를 프록시 객체로 전송하는 것입니다. 이것의 장점은 대상 객체가 코드를 변경하지 않고도 프록시 객체를 통해 몇 가지 추가 기능을 추가할 수 있다는 것입니다. 이는 원본 코드를 변경하지 않고 에이전트를 통해 일부 확장 기능을 추가하는 프로그래밍 아이디어입니다.
프록시 프로세스는 그림과 같으며, 프록시 객체는 대상 객체에 액세스하여 사용자가 대상 객체에 액세스하는 목적을 달성합니다. 세 가지 역할:
ISubject: 인터페이스 개체, 이 인터페이스는 개체와 해당 프록시가 공유하는 인터페이스입니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!