动态代理CGlib实例

1.委托类;

package 动态代理2;
//需要对这个类进行增强

public class UserService {

    public void create()
    {
        System.out.println("创建用户");
    }
    public  void update()
    {
        System.out.println("更新用户");

    }

}

2.代理类的实现

 1 package 动态代理2;
 2
 3 import java.lang.reflect.Method;
 4
 5 import net.sf.cglib.proxy.Enhancer;
 6 import net.sf.cglib.proxy.MethodInterceptor;
 7 import net.sf.cglib.proxy.MethodProxy;
 8
 9 public class ProxyCglib implements MethodInterceptor{
10     //根据传入的名字来判断是否有操作权限
11     private Enhancer enhancer=new Enhancer();
12
13     private String name=null;
14
15     public ProxyCglib(String name)
16     {
17         this.name=name;
18
19     }
20     //获得代理类的对象,传入参数为委托类
21     public Object getProxy(Class clazz){
22           //设置需要创建子类的类
23           enhancer.setSuperclass(clazz);
24           enhancer.setCallback(this);
25           //通过字节码技术动态创建子类实例
26           return enhancer.create();
27          }
28
29
30
31     public Object intercept(Object arg0, Method arg1, Object[] arg2,
32             MethodProxy arg3) throws Throwable {
33         // TODO Auto-generated method stub
34
35         if(!name.equals("han"))
36         {
37          System.out.println("权限不足");
38         }
39         else
40         {
41             arg3.invokeSuper(arg0, arg2);
42
43         }
44
45         return null;
46     }
47
48
49 }

3.客户端:测试

package 动态代理2;
//ref: http://songbo-mail-126-com.iteye.com/blog/968792

public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //为用户张三创建一个代理对象
    /*
        ProxyCglib proxy=new ProxyCglib("张三");
        UserService user=(UserService) proxy.getProxy(UserService.class);
        user.create(); */

        ProxyCglib proxy2=new ProxyCglib("han");
        UserService user2 =(UserService) proxy2.getProxy(UserService.class);
        user2.create();

    }

}
时间: 2024-10-06 10:11:14

动态代理CGlib实例的相关文章

获取JDK动态代理/CGLIB代理对象代理的目标对象。

问题描述:: 我现在遇到个棘手的问题,要通过spring托管的service类保存对象,这个类是通过反射拿到的,经过实验发现这个类只能反射取得sservice实现了接口的方法,而extends类的方法一律不出现,debug后发现这个servie实例被spring替换成jdkdynmicproxy类,而不是原始对象了,,它里面只有service继承的接口方法,而没有extends 过的super class方法,怎么调用原生对象的方法!!!!! 用托管的spring service类调用getCl

zbb20180930 代理模式 -静态代理-jdk动态代理-cglib动态代理

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

设计模式--动态代理(CGLIB)

上一篇文章<设计模式--动态代理(JDK)>已经写了JDK中动态代理的应用,这篇文章将介绍动态代理在CGLIB中应用.,从上篇文章中我们知道使用JDK动态代理是有一定限制.就是被代理类必须至少实现一个接口,因为JDK为我们生成的动态代理也是实现这个接口的.所以如果没有接口,JDK基本就歇菜了.CGLIB正好弥补了JDK的这个缺陷,他的被代理类是无需实现接口,因为它的实现机制是继承被代理类,从而创建一个代理对象(继承被代理对象)的. CGLIB(Code Generation Library)是

java 静态代理 JDK动态代理 Cglib动态代理

下面以一个简单的银行账户为例讲述讲述动态代理. 设计一个银行账户类,包含用户的账户余额,实现查询和更新余额功能 这个系统用了一段时间,有客户要求对账说账户余额给弄错了?因为上面没有存取款记录,最后银行不认账,客户收到了损失.银行为了避免这种现象再次发生,决定对这个系统进行修改,但是因为bankAccount太过复杂,希望在不修改bankAccount的情况下,增加日志功能. 静态代理 使用静态代理解决上面的问题. 银行要求所有模块都需要添加日志功能,这对苦逼的程序员来说真的是一个不小的工作量啊,

Java反射学习总结四(动态代理使用实例和内部原理解析)

通过上一篇文章介绍的静态代理Java反射学习总结三(静态代理)中,大家可以发现在静态代理中每一个代理类只能为一个接口服务,这样一来必然会产生过多的代理,而且对于每个实例,如果需要添加不同代理就要去添加相应的代理类.解决这一问题最好的做法是可以通过一个代理类完成全部的代理功能或者说去动态的生成这个代理类,那么此时就必须使用动态代理完成. 动态代理知识点: Java动态代理类位于java.lang.reflect包下,主要有以下一个接口和一个类: 1.InvocationHandler接口:    

JDK动态代理 cglib动态代理的深入理解

代理: 可以从社会分工来理解代理,我们每个人都有自己明确的社会分工,比如我的社会分工是程序员, 而代理商,也叫中介也是一种职业.因为社会分工的明确才能提高生产力! 举个栗子: 如果我想去香港买奶粉,那么我可以有两种选择,一种是自己抽时间自己去买奶粉,一种是委托给代购去买奶粉.如果自己去买,那么需要自己去办理通行证,去制定行程路线,去做购物攻略,一个人怕走丢还要约同伴.......等等各种让自己分心分神的事情,那么就生产力而言,如果我委托给代购,那么我能节省更多的时间.精力去做好自己的社会分工,更

spring 代理(静态代理&amp;动态代理&amp;cglib代理)

介绍spring AOP之前 先介绍三种常见的代理方式:静态代理,动态代理,cglib代理 代理概述: 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式:即通过代理访问目标对象.这样好处: 可以在目标对象实现的基础上,增强额外的功能操作.(扩展目标对象的功能). 举例:明星(邓紫棋)<------经纪人<-------用户 目标        (代理) 一.静态代理 1)代理的对象要实现与目标对象一样的接口 2)举例:保存用户(模拟) Dao,直接保存 DaoProxy,给保存

Java代理之(jdk静态代理/jdk动态代理/cglib动态代理/aop/aspectj)

一.概念 代理是什么呢?举个例子,一个公司是卖摄像头的,但公司不直接跟用户打交道,而是通过代理商跟用户打交道.如果:公司接口中有一个卖产品的方法,那么公司需要实现这个方法,而代理商也必须实现这个方法.如果公司卖多少钱,代理商也卖多少钱,那么代理商就赚不了钱.所以代理商在调用公司的卖方法后,加上自己的利润然后再把产品卖给客户.而客户部直接跟公司打交道,或者客户根本不知道公司的存在,然而客户最终却买到了产品. 专业点说:代理模式是对象的结构型模式,代码模式给某一个对象提供代理,并由代理对象控制原对象

一个简单 JDK 动态代理的实例

动态代理的步骤: 创建一个实现了 InvocationHandler 接口的类,必须重写接口里的 invoke()方法. 创建被代理的类和接口 通过 Proxy 的静态方法 newProxyInsatance(ClassLoader loader,Class[] interfaces,InvocationHandler,handler) 来创建一个代理 通过代理来调用方法 简单的动态代理实例 1 package com.sean.zzzjvm; 2 3 import java.lang.refl