动态代理与子类代理

1.动态代理

java.lang.reflect.Proxy 对象

帮我们生成一个代理对象来完成这个记录日志的工作

动态代理:被代理的对象一定要实现接口

loader: 类加载器,跟被代理对象(UserDao)一致即可

interfaces: 被代理对象的接口列表

h这个参数: 传入的是这个接口的实现类

动态生成的子类

 1 //使用动态代理工具生成代理对象
 2 public class DynamicProxyUtil {
 3    /**
 4     * 获取动态代理对象
 5     * @param obj   目标对象
 6     * @return      代理对象
 7     */
 8    public static  Object getProxyObj(final Object obj){
 9       return Proxy.newProxyInstance(
10             //获取类加载器
11             obj.getClass().getClassLoader(),
12             //获取接口列表
13             obj.getClass().getInterfaces(),
14             //增强的功能在这里
15             new InvocationHandler() {
16                 /**
17                  * proxy :代理对象
18                  * method:方法
19                  * args:参数列表
20                  */
21                 @Override
22                 public Object invoke(Object proxy, Method method, Object[] args)
23                       throws Throwable {
24                    //记录日志
25                    System.out.println("记录日志了.......");
26                    //回调目标对象的方法
27                    /* obj:目标对象
28                     * args: 参数列表
29                     */
30                    method.invoke(obj, args);
31                    return null;

 2.子类代理

子类也是一种增强的方式

通过第三方的工具来实现子类代理: Cglib

Enhancer类来帮我们生成子类的代理

1)导jar包,我们spring的ioc包中已经集成cglig的包

 1 //子类代理
 2 public class SubProxyUtil {
 3    /**
 4     * 通过这个方法生成被代理对象的子类
 5     * @param obj
 6     * @return
 7     */
 8    public static Object getSubProxyObj(final Object obj){
 9       //通过cglig的工具类生成子类的代理对象
10       Enhancer en = new Enhancer();
11       //传入父类
12       en.setSuperclass(obj.getClass());
13       //做增强,回调
14       en.setCallback(new MethodInterceptor() {
15          //这个方法就是做的增强
16          /**
17           * arg0 :代理对象
18           * Method:被代理对象的方法
19           * arg2:参数列表
20           * MethodProxy:代理对象的方法
21           */
22          @Override
23          public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
24
25             if(arg1.getName().equals("save")){
26                 //增强
27                 System.out.println("记录日志了:"+arg1.getName());
28             }
29             //回调
30             /*
31              * obj:传入被代理的对象
32              * arg2:方法中使用的参数
33              */
34             arg1.invoke(obj, arg2);
35             return null;
36          }
37       });
38       //返回被代理对象的子类
39       return en.create();
40   /* 子类代理:帮我们完成记录日志的工作
41        */
42       //被代理的对象
43       UserDaoImpl2 userdao = new UserDaoImpl2();
44       //返回的子类
45       UserDaoImpl2 proxy = (UserDaoImpl2)SubProxyUtil.getSubProxyObj(userdao);
46       proxy.save();
47       proxy.update();

时间: 2024-10-11 18:30:15

动态代理与子类代理的相关文章

Spring框架_代理模式(静态代理,动态代理,cglib代理)

共性问题: 1. 服务器启动报错,什么原因? * jar包缺少.jar包冲突 1) 先检查项目中是否缺少jar包引用 2) 服务器: 检查jar包有没有发布到服务器下:                                      用户库jar包,需要手动发布到tomcat. (每次新建项目) 3) 重新发布项目 * 配置文件错误 (web.xml / struts.xml /bean.xml /hibernate.xml / *.hbm.xml) 明确的提示 * 端口占用 * we

Atitit 代理CGLIB 动态代理 AspectJ静态代理区别

Atitit 代理CGLIB 动态代理 AspectJ静态代理区别 1.1. AOP 代理主要分为静态代理和动态代理两大类,静态代理以 AspectJ 为代表:而动态代理则以 spring AOP 为代表 1 1.2. JDK动态代理是模拟接口实现的方式,cglib是模拟子类继承的方式1 1.3. CGLIB代理模式的缺点 在static和final方法上应用横切关注点也是无法做到的.2 1.1. AOP 代理主要分为静态代理和动态代理两大类,静态代理以 AspectJ 为代表:而动态代理则以 

(转)Java动态代理与CGLib代理

本文通过spring aop的代理实现简述了java动态代理和cglib的区别,有助于理解java的代理模式 转载自:http://www.iteye.com/topic/182654 Java代码 <br>public class UserDAOImpl{ <br><br>    public void save() { <br>        // TODO Auto-generated method stub <br>        Sys

[z]Java代理(jdk静态代理、动态代理和cglib动态代理)

一.代理是Java常用的设计模式,代理类通过调用被代理类的相关方法,并对相关方法进行增强.加入一些非业务性代码,比如事务.日志.报警发邮件等操作. 二.jdk静态代理 1.业务接口 1 2 3 4 5 6 7 8 9 10 11 12 13 /**  * 业务接口  * @author pc  *  */ public interface UserService {          // 增加一个用户     public void addUser();     // 编辑账户     pub

基于Spring AOP的JDK动态代理和CGLIB代理

一.AOP的概念  在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. 二.主要用途 将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务

Java代理(jdk静态代理、动态代理和cglib动态代理)

一.代理是Java常用的设计模式,代理类通过调用被代理类的相关方法,并对相关方法进行增强.加入一些非业务性代码,比如事务.日志.报警发邮件等操作. 二.jdk静态代理 1.业务接口 /** * 业务接口 * @author pc * */ public interface UserService { // 增加一个用户 public void addUser(); // 编辑账户 public void editUser(); } 2.业务实现类 /** * 业务实现类 * @author pc

Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)

第一种代理即Java的动态代理方式上一篇已经分析,在这里不再介绍,现在我们先来了解下GCLIB代理是什么?它又是怎样实现的?和Java动态代理有什么区别? cglib(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库.它可以在运行期扩展Java类与实现Java接口. cglib封装了asm,可以在运行期动态生成新的class. cglib用于AOP,jdk中的proxy必须基于接口,cglib却没有这个限制. 原理区别: java动态代理是利用反射机

JDK动态代理和CGLIB代理的区别

一.原理区别: java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理. 而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理. 1.如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 2.如果目标对象实现了接口,可以强制使用CGLIB实现AOP 3.如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换 如何强制使用

java 代理模式(静态代理、动态代理、Cglib代理) 转载

Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法 代理模式最大的特点就是代理类和实际业务类实现同一个接口(或继承同一父类),代理对象持有一个实际对象的引用,外部调用时操作的是代理对象,而在代理对象的内部实现中又会去调