java动态代理,proxy和cglib
java的proxy需要代理对象实现接口,cglib则不需要。
所以有人说spring的aop对于有接口的就用java的proxy,否则就用cglib。
java proxy
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyTest {
public static void main(String[] args) {
Worker1 w1 = new Worker1();
WorkerInvocationHandler handler = new WorkerInvocationHandler();
handler.instance = w1;
Class<?> c = w1.getClass();
Worker w = (Worker)Proxy.newProxyInstance(c.getClassLoader(), c.getInterfaces(), handler);
w.work();
System.out.println("------------");
Worker2 w2 = new Worker2();
handler.instance = w2;
c = w2.getClass();
w = (Worker)Proxy.newProxyInstance(c.getClassLoader(), c.getInterfaces(), handler);
w.work();
}
}
interface Worker {
void work();
}
class Worker1 implements Worker {
@Override
public void work() {
System.out.println("worker1 working...");
}
}
class Worker2 implements Worker {
@Override
public void work() {
System.out.println("worker2 working...");
}
}
class WorkerInvocationHandler implements InvocationHandler {
Object instance;
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before invoke...");
Object result = method.invoke(instance, args);
System.out.println("after invoke...");
return result;
}
}
cglib
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Callback;
import net.sf.cglib.proxy.CallbackFilter;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import net.sf.cglib.proxy.NoOp;
public class ProxyTest {
public static void main(String[] args) {
String name = "xx";
Factory.getWorker().work(name);
Factory.getWorker().x();
System.out.println("--------");
CglibProxyFactory.getWorker().work(name);
CglibProxyFactory.getWorker().x();
}
}
class Worker {
void work(String name) {
System.out.println(name + " is working...");
}
void x() {
System.out.println("xxxx");
}
}
class Factory {
static Worker getWorker() {
return new Worker();
}
}
class CglibProxyFactory {
static Worker getWorker() {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(Worker.class);
enhancer.setCallbacks(new Callback[]{new CglibProxy(), NoOp.INSTANCE});
enhancer.setCallbackFilter(new CallbackFilter() {
@Override
//返回Callbacks的索引
public int accept(Method method) {
//对x方法不拦截
if (method.getName().equals("x"))
return 1;
return 0;
}
});
return (Worker)(enhancer.create());
}
}
class CglibProxy implements MethodInterceptor {
@Override
public Object intercept(Object o, Method m, Object[] os,
MethodProxy mp) throws Throwable {
System.out.println("before invoke...");
Object result = mp.invokeSuper(o, os);
System.out.println("after invoke...");
return result;
}
}
版权声明:本文为whumr1原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。