• 动态代理


    1、代理

    以通俗方式理解

    目标对象/被代理对象------房主:真正的租房方法

    代理对象--------中介:有租房子的方法

    执行代理对象方法的对象------租房的人

    2、动态代理

    不用手动编写一个代理对象,不需要编写与目标对象相同的方法,运行时在内存中动态生成代理对象。

    生成动态代理的方法:

    static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)

    1 package com.alphajuns.proxy;
    2 
    3 public interface TargetInterface {
    4     
    5     public abstract void method1();
    6     public abstract String method2();
    7     public abstract int method3(int x);
    8     
    9 }
     1 package com.alphajuns.proxy;
     2 
     3 public class Target implements TargetInterface {
     4 
     5     @Override
     6     public void method1() {
     7         System.out.println("method1 running ...");
     8     }
     9 
    10     @Override
    11     public String method2() {
    12         System.out.println("method2 running ...");
    13         return "method2";
    14     }
    15 
    16     @Override
    17     public int method3(int x) {
    18         System.out.println("method3 running ...");
    19         return x;
    20     }
    21 
    22 }
     1 package com.alphajuns.proxy;
     2 
     3 import java.lang.reflect.InvocationHandler;
     4 import java.lang.reflect.Method;
     5 import java.lang.reflect.Proxy;
     6 
     7 import org.junit.Test;
     8 
     9 public class ProxyTest {
    10     
    11     @Test
    12     public void test() {
    13         // 获得动态代理对象,在程序运行时,在内存中动态的为Target创建一个虚拟的代理对象
    14         TargetInterface objProxy = (TargetInterface) Proxy.newProxyInstance(
    15                 Target.class.getClassLoader(), 
    16                 new Class[]{TargetInterface.class}, 
    17                 new InvocationHandler() {
    18                     // invoke执行代理对象的方法
    19                     // method代表目标对象的方法字节码对象
    20                     // args代表目标对象相应的方法参数
    21                     @Override
    22                     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    23                         System.out.println("目标对象方法前的逻辑");
    24                         // 执行目标对象的方法
    25                         Object invoke = method.invoke(new Target(), args);
    26                         System.out.println("目标对象方法后的逻辑");
    27                         return invoke;
    28                     }
    29                 }
    30                 );
    31         
    32         objProxy.method1();
    33         String method2 = objProxy.method2();
    34         System.out.println(method2);
    35     }
    36 }
  • 相关阅读:
    面试题|Docker的优缺点
    【华为出品】物联网全栈开发实战营来啦!送海思双目开发板
    Nginx实战|Nginx健康检查
    Linux中几个正则表达式的用法
    盘点提高国内访问 Github 的速度的 9 种方案
    一行代码如何隐藏 Linux 进程?
    (二)类加载机制与反射:类加载器
    (一)类加载机制与反射:类的加载,连接和初始化
    (八)多线程:线程相关类
    (七)多线程:线程池
  • 原文地址:https://www.cnblogs.com/alphajuns/p/9980338.html
Copyright © 2020-2023  润新知