您的位置:首页 > 编程语言 > Java开发

java动态代理,proxy和cglib

2014-03-13 11:24 555 查看
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: