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

动态代理

时间:2022-10-23 23:14:37浏览次数:48  
标签:代理 class proxy test TargetClass 动态 public

动态代理为我们实现了方法增强功能。java的动态代理主要有jdk自带的动态代理和cglib动态代理。

1、jdk动态代理需要根据接口实现,一个新实现该接口的代理类。

2、cglib动态代理则是直接作用于对象,直接继承原始类,实现增强。

直接上代码

 

 

 1、jdk动态代理使用

package com.example.spring.proxy.jdk;

public interface TargetInterface {
    void test();
}


package com.example.spring.proxy.jdk;

public class TargetClass implements TargetInterface {
    @Override
    public void test() {
        System.out.println("test");
    }
}

package com.example.spring.proxy.jdk;

import java.lang.reflect.Proxy;

public class Test {

    /**
     * jdk 动态代理是基于接口实现一个代理类,从而实现增强
     *
     * @param args
     */
    public static void main(String[] args) {
        TargetClass targetClass = new TargetClass();

        TargetInterface targetInterface = (TargetInterface) Proxy.newProxyInstance(Test.class.getClassLoader(),
                new Class[]{TargetInterface.class},
                (proxy, method, rgs) -> {
                    System.out.println("before");
                    Object object = method.invoke(targetClass, args);
                    System.out.println("after");
                    return object;
                }
        );

        targetInterface.test();
    }
}

 

2、cglib动态代理使用

package com.example.spring.proxy.cglb;

public class TargetClass { public void test() { System.out.println("test"); } } package com.example.spring.proxy.cglb; import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy; import java.lang.reflect.Method; public class Test { public static void main(String[] args) { TargetClass targetClass = new TargetClass(); Enhancer enhance = new Enhancer(); enhance.setSuperclass(TargetClass.class); enhance.setCallback(new MethodInterceptor() { @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("before"); Object obj = method.invoke(targetClass, objects); System.out.println("after"); return obj; } }); TargetClass proxy = (TargetClass) enhance.create(); proxy.test(); } }

 

标签:代理,class,proxy,test,TargetClass,动态,public
From: https://www.cnblogs.com/wzllzw/p/16819970.html

相关文章

  • DEVEXPRESS 动态列
    gvMain.BeginUpdate();vartemp1=newGridColumn(){FieldName=nameof(CustomerLabelImportDto.Code),Caption="编码",......
  • Mybatis 动态SQL
    mybatis-08实体类publicinterfaceBlogMapper{//查询博客List<Blog>queryBlogIF(Mapmap);List<Blog>queryBlogChoose(Mapmap);//更新......
  • #yyds干货盘点# 动态规划专题:连续子数组最大和
    1.简述:描述给定一个长度为 的数组,数组中的数为整数。请你选择一个非空连续子数组,使该子数组所有数之和尽可能大,子数组最小长度为1。求这个最大值。输入描述:第一行为一个正......
  • #yyds干货盘点# 动态规划专题:最小花费爬楼梯
    1.简述:描述给定一个整数数组  ,其中  是从楼梯第个台阶向上爬需要支付的费用,下标从0开始。一旦你支付此费用,即可选择向上爬一个或者两个台阶。你可以选择从下标为0或下......
  • #yyds干货盘点# 动态规划专题:有多少个不同的二叉搜索树
    1.简述:描述给定一个由节点值从1到n的n个节点。请问由多少种不同的方法用这n个节点构成互不相同的二叉搜索树。数据范围: 输入描述:仅一行输入一个正整数n,表示节点......
  • 动态规划递归公式理解
    dp[i][j]表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少。递推公式:dp[i][j]的含义:从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是......
  • Nginx的proxy_pass url 反向代理的配置
    说到Nginx就不得不说Nginx的反向代理是多么的好用,一个指令 proxy_pass 搞定反向代理,对于接口代理、负载均衡很是实用,但 proxy_pass 指令后面的参数很有讲究。网上......
  • 动态DP 笔记
    矩乘大家都会!线段树大家都会!所以动态DP就这样诞生了!一些线性能做的DP可以写成广义矩阵乘法的形式,只要这个广义矩阵乘法具有结合律,那么就可以进行区间查询一类的操......
  • new创建动态内存
    int*q=newint;*q=3;cout<<*q<<endl;deleteq;int*q=newint(3);//两种方式newcout<<*q<<endl;deleteq;......
  • 动态规划(二)
    动态规划(二)动态规划问题的的一般思路:(数学归纳思想)判别问题是否具有最有子结构找到basecase,通过状态转移关系确认每一步的状态转换,定义dp数组的含义主要难点在于状态......