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

动态代理

时间:2022-12-07 15:44:05浏览次数:36  
标签:target Object 代理 Shape 动态 public

概述

什么是动态代理

  • 使用 JDK 的反射机制,创建对象的能力, 创建的是代理类的对象,不用自己创建类文件,不用写 Java 文件。
  • 动态:在程序执行时,调用 JDK 提供的方法才能创建代理类的对象。
  • JDK 动态代理,必须有接口,目标类必须实现接口,没有接口时,需要使用 cglib 动态代理。

动态代理能做什么

  • 可以在不改变原来目标方法功能的前提下,可以在代理中增强自己的功能代码。

简单示例

public interface Shape {
    String getName();
}
public class Square implements Shape { @Override public String getName() { return "方形"; } } public class Cycle implements Shape { @Override public String getName() { return "圆形"; } }
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class DemoInvocationHandler implements InvocationHandler {

    private Object target;

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

    /**
     * 获取动态代理对象
     *
     * @param target
     * @return
     */
    public static Object dynamicProxy(final Object target) {
        return Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                new DemoInvocationHandler(target)
        );
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("==> 方法执行前");
        Object result = method.invoke(this.target);
        System.out.println("  执行结果: " + result);
        System.out.println("<== 方法执行后");
        return result;
    }

}
/**
 *
 * JDK 动态代理,调用100次,比原生方法调用慢了不到1毫秒
 * System.setProperty("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
 *
 */
public class JDKDynamicProxyTest {
    public static void main(String[] args) {
        Shape shape = (Shape) DemoInvocationHandler.dynamicProxy(new Cycle());
        shape.getName();
    }
}

 执行结果:

==> 方法执行前
  执行结果: 圆形
<== 方法执行后

 

标签:target,Object,代理,Shape,动态,public
From: https://www.cnblogs.com/steven-note/p/16962916.html

相关文章

  • 动态SQL遇到的问题
    看图    查不出来任何数据因为判断有问题修改方法如下: ......
  • android nativate 动态注册 静态注册
    说明:在java函数的入口比较容易分析,把activity的生命周期或者关键函数通过放在so层,分析起来就困难多了 1、在MainActivity中packagecom.demo.nativate;import......
  • Java通过JNA方式调用DLL(动态链接库)
    Java通过JNA方式调用DLL(动态链接库)1.JNA简单介绍先说JNI(JavaNativeInterface)吧,有过不同语言间通信经历的一般都知道,它允许Java代码和其他语言(尤其C/C++)写的代码进......
  • 打家劫舍(一) 动态规划
        import java.util.*;public class Solution {    /**     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 ......
  • layui文件上传需要编写动态URL的时候需要重载方法
    varuploadInst=upload.render({elem:'#WebButton'/*,url:url//此处配置你自己的上传接口即可*/,auto:true......
  • C++_动态链接库和搜索共享库
    标准1998 C++982011 C++11ISO/IEC14882:2011 2014 C++142017 C++172020 ISOC++委员会正式发布了C++20标准,命名为ISO/IEC14882:2020 实现01.命令查看自己......
  • 代理模式
    代理模式基本介绍    如果不使用代理模式,按照我们传统模式是Client直接调用TargetObject对象。  静态代理  思路分析图解  代码实现packag......
  • 动态获取配置文件
    首先是添加NuGet包依赖,主要依赖一下3个包Microsoft.Extensions.ConfigurationMicrosoft.Extensions.Configuration.FileExtensionsMicrosoft.Extensions.Configuration.......
  • (转)Python中动态导入对象importlib.import_module()的使用
    背景一个函数运行需要根据不同项目的配置,动态导入对应的配置文件运行。解决文件结构a#文件夹│a.py│__init__.pyb#文件夹│b.py│__init__.py├─c#文件夹│......
  • 015.3MyBatis动态SQL(多条件复合查询)
    1.goods.xml<selectid="dynamicSQL"parameterType="java.util.Map"resultType="com.imooc.mybatis.entity.Goods">select*fromt_goods<where>......