package proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @author chexingyou
* @date 2013-6-6
*/
interface Dao {
void show();
void say();
}
interface Dao2 {
void say();
}
class Imp implements Dao, Dao2 {
public void show() {
System.out.println("do show");
}
public void say() {
System.out.println("do say");
}
}
class Handler implements InvocationHandler {
private Object obj;
public Handler(Object obj) {
this.obj = obj;
}
public static Object create(Object obj) {
return Proxy.newProxyInstance(Imp.class.getClassLoader(), Imp.class.getInterfaces(),
new Handler(obj));
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before " + method.getName());
Object ret = method.invoke(obj, args);
System.out.println("after " + method.getName());
return ret;
}
}
public class Test {
public static void main(String[] args) {
Dao imp = new Imp();
Dao proxy = (Dao) Handler.create(imp);
proxy.show();
proxy.say();
Dao2 proxy2 = (Dao2) Handler.create(imp);
proxy2.say();
}
}
package cglib;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
/**
* @author chexingyou
* @date 2013-6-7
*/
class Imp {
public void say() {
System.out.println("say()");
}
}
class CglibProxy implements MethodInterceptor {
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy)
throws Throwable {
System.out.println("do before");
Object ret = proxy.invokeSuper(obj, args);
System.out.println("do after");
return ret;
}
public Object getProxy(Class<?> clazz) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
return enhancer.create();
}
}
public class Test {
public static void main(String[] args) {
CglibProxy proxy = new CglibProxy();
Imp imp = (Imp) proxy.getProxy(Imp.class);
imp.say();
}
}