//cglib代理
通过cglib创建代理类,好处是不要求我们的目标对象实现接口
1 准备架包
asm.jar
cglib.jar
2 man(要代理的对象)的编写
package com.aop.cglib;
public class Man {
private String name;
public Man()
{
}
public Man(String name)
{
this.name = name;
}
public void addMan()
{
System.out.println("add Man");
}
public void deltMan()
{
System.out.println("delete Man");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3 代理工厂CglibProxy的编写
package com.aop.cglib;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class CglibProxy implements MethodInterceptor {
private Object o;
/**
* 创建要代理的对象,并返回
* @param o
* @return
*/
public Object crateProxyObject(Object o)
{
this.o = o;
Enhancer eh = new Enhancer();
eh.setSuperclass(o.getClass());
eh.setCallback(this);
return eh.create();
}
@Override
public Object intercept(Object arg0, Method arg1, Object[] arg2,
MethodProxy arg3) throws Throwable {
// TODO Auto-generated method stub
Man man = (Man)o;
String name = man.getName();
Object result = "none";
if(name != null && !name.equals(""))
{
result = arg3.invoke(o, arg2);
}
System.out.println("result:"+result);
return result;
}
}
4 测试类TestProxy的编写
package com.aop.cglib;
public class TestProxy {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
CglibProxy c = new CglibProxy();
Man man = (Man)c.crateProxyObject(new Man("1"));
man.addMan();
man.deltMan();
}
}
5 总结
根据程序可知:
如果man对象的name为空,则man的方法被拦截,不会执行
如果man对象的name不为空,则arg3.invoke(o, arg2)方法执行