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

10_Spring_CGLIB动态代理

时间:2023-03-02 23:06:11浏览次数:34  
标签:10 Spring Object public Person CGLIB import 父类 eat


 proxy 动态代理
面向接口
1必须有接口和实现类  
2增强接口中定义的方法
3只能读取接口中方法的上注解

cglib动态代理模式
面向父类

10_Spring_CGLIB动态代理_父类

 

package com.msb.testCglib;
import org.junit.Test;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
/**
* @Author: Ma HaiYang
* @Description: MircoMessage:Mark_7001
*/
public class Test1 {
@Test
public void testCglib(){
Person person =new Person();
// 获取一个Person的代理对象
// 1 获得一个Enhancer对象
Enhancer enhancer=new Enhancer();
// 2 设置父类字节码
enhancer.setSuperclass(person.getClass());
// 3 获取MethodIntercepter对象 用于定义增强规则
MethodInterceptor methodInterceptor=new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
/*Object o, 生成之后的代理对象 personProxy
Method method, 父类中原本要执行的方法 Person>>> eat()
Object[] objects, 方法在调用时传入的实参数组
MethodProxy methodProxy 子类中重写父类的方法 personProxy >>> eat()
*/
Object res =null;
if(method.getName().equals("eat")){
// 如果是eat方法 则增强并运行
System.out.println("饭前洗手");
res=methodProxy.invokeSuper(o,objects);
System.out.println("饭后刷碗");
}else{
// 如果是其他方法 不增强运行
res=methodProxy.invokeSuper(o,objects); // 子类对象方法在执行,默认会调用父类对应被重写的方法
}
return res;
}
};
// 4 设置methodInterceptor
enhancer.setCallback(methodInterceptor);
// 5 获得代理对象
Person personProxy = (Person)enhancer.create();
// 6 使用代理对象完成功能
personProxy.eat("包子");
}
}
class Person {
public Person( ) {
}
public void eat(String foodName) {
System.out.println("张三正在吃"+foodName);
}
}

10_Spring_CGLIB动态代理_spring_02

10_Spring_CGLIB动态代理_spring_03

 

 


标签:10,Spring,Object,public,Person,CGLIB,import,父类,eat
From: https://blog.51cto.com/u_15975228/6096791

相关文章

  • 10_Spring_CGLIB动态代理
     proxy动态代理面向接口1必须有接口和实现类 2增强接口中定义的方法3只能读取接口中方法的上注解cglib动态代理模式面向父类 packagecom.msb.testCglib;importo......
  • 6_Spring_Bean的自动装配
     bean自动装配通过property标签可以手动指定给属性进行注入我们也可以通过自动转配,完成属性的自动注入,就是自动装配,可以简化DI的配置准备实体类 packagecom.msb.be......
  • 6_Spring_Bean的自动装配
     bean自动装配通过property标签可以手动指定给属性进行注入我们也可以通过自动转配,完成属性的自动注入,就是自动装配,可以简化DI的配置准备实体类 packagecom.msb.be......
  • msvcr100.dll丢失是什么意思-msvcr100.dll丢失解决方法
    丢失msvcr100.dll或者损坏会导致电脑很多软件跟游戏都无法正常打开运行。还有不少小伙伴不知道怎么修复,小编今天就把修复教程分享给大家;最简单的修复方法电脑开机打开任意一......
  • [转]Windows10下CLion配置说明
    Windows10下CLion配置说明CLion是C/C++的IDE,可以配置多种编译环境,本文以配置MinGW编译环境为例。安装CLion的安装可直接到官网下载ZIP,文件解压后直接运行即可。我在......
  • SQL注入之延时注入(10)
    以下提供两种方式进行延时注入GET/sqli/Less-10/?id=1"+and+sleep(5)--+HTTP/1.1Host:192.168.245.146:6101User-Agent:Mozilla/5.0(X11;Linuxx86_64;rv:102.0......
  • 10_Spring_CGLIB动态代理
    ​ proxy动态代理面向接口1必须有接口和实现类 2增强接口中定义的方法3只能读取接口中方法的上注解cglib动态代理模式面向父类 packagecom.msb.testCglib......
  • 10_Spring_CGLIB动态代理
    ​ proxy动态代理面向接口1必须有接口和实现类 2增强接口中定义的方法3只能读取接口中方法的上注解cglib动态代理模式面向父类 packagecom.msb.testCglib......
  • 6_Spring_Bean的自动装配
    ​ bean自动装配通过property标签可以手动指定给属性进行注入我们也可以通过自动转配,完成属性的自动注入,就是自动装配,可以简化DI的配置准备实体类 packageco......
  • 6_Spring_Bean的自动装配
    ​ bean自动装配通过property标签可以手动指定给属性进行注入我们也可以通过自动转配,完成属性的自动注入,就是自动装配,可以简化DI的配置准备实体类 packageco......