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 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>