首页 > 其他分享 >jdk的动态代理

jdk的动态代理

时间:2023-03-24 21:13:44浏览次数:31  
标签:target jdk int Object 代理 public 动态 method

jdk动态代理:(jdk动态代理,必须有接口)

1-Calculator接口内容:

public interface Calculator {
    int add(int i, int j);

    int sub(int i, int j);

    int mul(int i, int j);

    int div(int i, int j);
}

2-生产 "代理" 的工厂类

public class ProxyFactory {
    private Object target;

    public ProxyFactory(Object target) {
        this.target = target;
    }

    public Object getProxy() {
/**
 * newProxyInstance():创建一个代理实例 * 其中有三个参数:
 * 1、classLoader:加载动态生成的代理类的类加载器
 * 2、interfaces:目标对象实现的所有接口的class对象所组成的数组
 * 3、invocationHandler:设置代理对象实现目标对象方法的过程,即代理类中如何重写接 口中的抽象方法
 */
        ClassLoader classLoader = target.getClass().getClassLoader();
        Class<?>[] interfaces = target.getClass().getInterfaces();
        InvocationHandler invocationHandler = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                /**
                 * proxy:代理对象
                 * * method:代理对象需要实现的方法,即其中需要重写的方法
                 * * args:method所对应方法的参数
                 */
                Object result = null;
                try {
                    System.out.println("[动态代理][日志] " + method.getName() + ",参 数:" + Arrays.toString(args));
                    result = method.invoke(target, args);
                    System.out.println("[动态代理][日志] " + method.getName() + ",结 果:" + result);
                } catch (Exception e) {
                    e.printStackTrace();
                    System.out.println("[动态代理][日志] " + method.getName() + ",异 常:" + e.getMessage());
                } finally {
                    System.out.println("[动态代理][日志] " + method.getName() + ",方法 执行完毕");
                }
                return result;
            }
        };
        return Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);
    }
}

3-Test:

 @Test
    public void testProxyFactory() {
        ProxyFactory factory = new ProxyFactory(new CalculatorPureImpl());
        Calculator c = (Calculator) factory.getProxy(); //这个是Calculator接口
        c.add(1,1);
        //c.div(1,0);
    }

标签:target,jdk,int,Object,代理,public,动态,method
From: https://www.cnblogs.com/chen-zhou1027/p/17253334.html

相关文章

  • 【LeetCode动态规划#02】图解不同路径I + II(首次涉及二维dp数组,)
    不同路径力扣题目链接(opensnewwindow)一个机器人位于一个mxn网格的左上角(起始点在下图中标记为“Start”)。机器人每次只能向下或者向右移动一步。机器人试图......
  • 代码随想录算法训练营Day52 动态规划
    代码随想录算法训练营代码随想录算法训练营Day52动态规划|300.最长递增子序列674.最长连续递增序列718.最长重复子数组300.最长递增子序列题目链接:300.最长递增子......
  • virtualbox 扩展动态磁盘 Centos7扩容
    阅读目录virtualbox扩展动态磁盘大小的坑调整VirtualBox虚拟磁盘VDI文件空间大小查看新的磁盘空间创建新分区调整LVM大小1先看一下VolumeGroup名称,我这边VGName是......
  • 动态规划
    遇到动态规划的一般解题思路:1.确定步骤状态在动态规划中的作用属于定海神针。简单来说,解动态规划的时候需要开一个数组,数组的每个元素f【i】或者f【i】【j】代表什么确定......
  • 在同一网络下手机通过代理服务连接电脑的socks
    让手机和电脑连接同一WiFi,查看电脑的IP地址。此为192.168.1.100ipconfig2.打开电脑的socks,并查看端口,此端口为108083.打开手机WIFI连接,选择高级设置,点击代理,选择......
  • Webservice入门教程_用JDK开发Webservice
    实现搭建服务端打开Eclipse新建Javaproject,在src下新建包com.badao.ws包下新建接口HellloWS.javapackagecom.badao.ws;importjavax.jws.WebMethod;importjavax.jws.......
  • ASEMI代理NXP汽车芯片MIMXRT1064CVJ5B
    编辑-ZMIMXRT1064CVJ5B工业产品交叉处理器MIMXRT1064CVJ5B是一个新的处理器系列,采用了恩智浦先进的ArmCortex®-M7内核,其运行速度高达528MHz,可提供高CPU性能和最佳实时响......
  • ASEMI代理NXP汽车芯片PCF85163T/1,518
    编辑-ZPCF85163T/1,518是一款针对低功耗进行优化的CMOS1实时时钟(RTC)和日历。还提供了可编程时钟输出、中断输出和低电压检测器。所有地址和数据通过双线双向I2C总线串行传输......
  • CAD动态块操作实例:距离乘数
    作为一名“成熟”的设计师,相信大家对于CAD动态块都不陌生,以下图为例,对部件左端进行拉伸,且拉伸后【键】仍处于部件左端的中心位置。今天,我们要用CAD动态块动作的【距离乘数......
  • Openlayers中使用Cluster实现点位元素重合时动态聚合与取消聚合
    场景Openlayers中使用Cluster实现缩放地图时图层聚合与取消聚合:Openlayers中使用Cluster实现缩放地图时图层聚合与取消聚合_BADAO_LIUMANG_QIZHI的博客-上面实现缩放地图时......