**上篇已经写过基于接口的动态代理,基于子类的动态代理我们需要引入第三方的jar包,cglib-3.2.12.jar和asm-7.1.jar,可以直接在maven仓库http://mvnrepository.com/ 下载。在上篇的基础上我们删掉接口,**代码如下:
原生类:
package com.yy.proxy;
public class Actor{
public void basicAct(float money) {
System.out.println("拿到钱,开始基本表演:"+money);
}
public void dangerAct(float money) {
System.out.println("拿到钱,开始危险表演:"+money);
}
}
测试类:
package com.yy.proxy;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
public class Client {
public static void main(String[] args) {
Actor actor=new Actor();
/**
* 动态代理:
* 作用:不改变源码的基础上,对已有的方法进行增强(AOP思想的实现技术)
* 分类:
* 基于子类的动态代理:
* 要求:被代理类不能是最终类,即不能被final修饰
* 提供者:第三方CGLib
* 涉及的类:Enhancer
* 创建代理对象的方法:create(Class,Callback)
* 参数的含义:Class,被代理对象的字节码
* Callback,如何代理,它和Handler的作用是一样的,也是个接口,一般使用改接口的子类
*
*
*/
Actor cglibactor=(Actor) Enhancer.create(actor.getClass(), new MethodInterceptor() {
/**
*
* 参数意义:intercept方法中前面三个参数和Proxy.newProxyInstance方法是一样的
* MethodProxy表示当前执行方法的代理的对象,一般不用
*/
@Override
public Object intercept(Object proxy, Method method, Object[] args2, net.sf.cglib.proxy.MethodProxy MethodProxy)
throws Throwable {
// TODO Auto-generated method stub
Object rtValue=null;
//1.取出执行方法中的参数
Float money=(Float) args2[0];
//2.判断当前执行的是什么方法
if("basicAct".equals(method.getName())) {
if(money>=100000) {
rtValue= method.invoke(actor, money/2);
}
}
if("dangerAct".equals(method.getName())) {
if(money>=200000) {
rtValue= method.invoke(actor, money/2);
}
}
return rtValue;
}
});
cglibactor.basicAct(100000);
cglibactor.dangerAct(200000);
}
}