3、将CGLIB再做一个简单的包装:
class CglibProxy implements MethodInterceptor{
private Object srcTarget;
private CglibProxy(Object o){
this.srcTarget = o;
}
@SuppressWarnings("unchecked")
public static <T>T proxyTarget(T t){
Enhancer en = new Enhancer();
en.setSuperclass(t.getClass());
en.setCallback(new CglibProxy(t));
T tt = (T) en.create();
return tt;
}
@Override
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
System.err.println("拦截前...");
Object o = method.invoke(srcTarget, args);
System.err.println("拦截后....");
return o;
}
}
包装以后的调用代码如下,主要是快速的实现获取被代理类:
Person p = CglibProxy.proxyTarget(new Person());
p.sayHi("HJello");
IAnimal dog = CglibProxy.proxyTarget(new Dog());
dog.eat();
4、使用静态方法代理一个没有接口的对象
以下代码,包含在一个测试方法或是main方法中运行:
final Person src = new Person();
//直接使用静态方法代理一个对象
Person p = (Person) Enhancer.create(Person.class,new MethodInterceptor(){
public Object intercept(Object proxyedObj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
System.err.println("Hello");
//使用原生的方法调用,注意里面的src
//Object oo = method.invoke(src, args);
//使用MethodProxy调用父类的代码,同样有效
Object oo = proxy.invokeSuper(proxyedObj, args);
return oo;
}
});
System.err.println(p.getClass());
p.abc(); |
|