En Java, proxy signifie : fournir un objet proxy à un objet, et le proxy L'objet contrôle l'accès à l'objet d'origine, c'est-à-dire que le client ne contrôle pas directement l'objet d'origine, mais contrôle indirectement l'objet d'origine via l'objet proxy.
En termes simples, c'est comme acheter un billet de train. Au départ, nous avions besoin d'une gare pour acheter un billet, mais maintenant nous avons mis en place des points de vente de billets, et vous pouvez acheter des billets directement via les points de vente de billets.
Les types d'agents sont :
La mise en œuvre des agents peut être divisée en agents statiques et agents dynamiques ; Les agents dynamiques sont également divisés en proxy dynamique JDK et proxy dynamique CLGIB.
Redondance des codes
Regardons l'exemple d'un proxy statique :
// 定义一个接口,代表书interface Book { void read(); }// 委托类(实现接口,包含了具体的业务逻辑)class Bible implements Book { @Override public void read() { System.out.println("Reading..."); } }// 静态代理类(其实是对 Bible 类的增强)class BookProxy implements Book { //委托对象,作为构造函数的参数 private Book book; BookProxy(Book book) { this.book = book; } @Override public void read() { System.out.println("Reading 调用之前"); book.read(); System.out.println("Reading 调用之后"); } }public class Test { public static void main(String[] args) { //静态代理调用 Book book = new Bible() BookProxy bookProxy = new BookProxy(book); bookProxy.read(); } }
Le proxy dynamique de DK s'appuie sur l'
interface, et le proxy dynamique CLGIB compense tout simplement cette lacune.
1. Proxy dynamique JDK
// 定义一个接口,代表书...// 委托类(实现接口,包含了具体的业务逻辑)... // 动态代理类 class BookHandler implements InvocationHandler{ private Object target; //绑定委托对象(JDK 动态代理的缺陷,只能绑定接口)并返回一个代理类 Object bind(Object target){ this.target = target; // 取得代理对象 return Proxy.newProxyInstance( target.getClass().getClassLoader(), // 类加载器 target.getClass().getInterfaces(), // 类的所有接口 this); // InvocationHandler } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("Reading 调用之前"); method.invoke(target, args); System.out.println("Reading 调用之后"); return null; } }public class Test { public static void main(String[] args) { // 动态代理调用 Book book = new Bible(); BookHandler bookHandler = new BookHandler(); Book bookProxy = (Book) bookHandler.bind(book); bookProxy.read(); } }
Jetons un coup d'œil à son exemple :
Ce qui précède est le contenu de 10.Java Basics - Proxy Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (. www.php.cn) !// 实现类(没有了接口,直接实现业务逻辑)class Book { public void read() { System.out.println("Reading..."); } }// 动态代理类class BookCglib implements MethodInterceptor{ private Object target; Object getInstance(Object target){ this.target = target; Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(this.target.getClass()); //回调方法 enhancer.setCallback(this); //创建代理对象 return enhancer.create(); } @Override public Object intercept(Object object, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("Reading 调用之前"); proxy.invoke(target, args); System.out.println("Reading 调用之后"); return null; } }public class Test { public static void main(String[] args) { BookCglib bookCglib = new BookCglib(); Book book = (Book) bookCglib.getInstance(new Book()); book.read(); } }