import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JDKProxyFactory implements InvocationHandler{
private Object object;
private Advisor advisor;
public Object getProxyInstance(Object object, Advisor advisor){
this.object=object;
this.advisor=advisor;
return Proxy.newProxyInstance(this.object.getClass().getClassLoader(), this.object.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result=null;
advisor.before();
try {
result = method.invoke(object, args);
advisor.after();
} catch (Exception e) {
advisor.exception();
e.printStackTrace();
}finally{
advisor.finaller();
}
return result;
}
}
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class CglibProxyFactory implements MethodInterceptor{
private Object object;
private Advisor advisor;
public Object getProxyInstance(Object object, Advisor advisor){
this.object=object;
this.advisor=advisor;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(this.object.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
Object result=null;
advisor.before();
try {
result = methodProxy.invoke(object, args);
advisor.after();
} catch (Exception e) {
advisor.exception();
e.printStackTrace();
}finally{
advisor.finaller();
}
return result;
}
}
public abstract class Advisor {
public void before(){
}
public void after(){
}
public void exception(){
}
public void finaller(){
}
}
public class TestAOP {
public static void main(String[] args) {
CglibProxyFactory factory = new CglibProxyFactory();
//JDKProxyFactory factory = new JDKProxyFactory(); //测试第二种方法
Student obj = (Student)factory.getProxyInstance(new StudentImpl(), new Advisor(){
@Override
public void before() {
System.out.println("before .");
super.before();
}
});
obj.getName();
}
}
两种方式的区别:
cglib的被代理类可以没有实现接口,代理类是被代理类的子类
jdk的被代理类必须实现一个接口