jdk动态代理
1.目标接口
public interface TargetInterface {
public void run();
}
2.目标对象
public class Target implements TargetInterface {
@Override
public void run() {
System.out.println("target running...");
}
}
3.增强对象
public class Boost {
public void before(){
System.out.println("增强前...");
}
public void after(){
System.out.println("增强后...");
}
}
4.测试对象
public class ProxyTest {
public static void main(String[] args) {
Target target = new Target();
Boost boost = new Boost();
TargetInterface o = (TargetInterface) Proxy.newProxyInstance(Target.class.getClassLoader(),//目标对象的类加载器
Target.class.getInterfaces(),//目标对象的类加载接口
new InvocationHandler() {
@Override
//回调函数
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
boost.before();
Object invoke = method.invoke(target, args);
boost.after();
return invoke;
}
});
o.run();
}
}
5.输出结果`
增强前...
target running...
增强后...
**注意:**在jdk动态代理中,生成的代理对象是目标对象的父接口,如果生成的对象类型是目标对象类型会报以下异常,在此种代理方式中代理对象和目标对象是兄弟关系,都是TargetInterface类型的(理解有误?)
cglib动态代理
1.目标对象
public class Target implements TargetInterface {
@Override
public void run() {
System.out.println("target running...");
}
}
2.增强对象
public class Boost {
public void before(){
System.out.println("增强前...");
}
public void after(){
System.out.println("增强后...");
}
}
3.测试对象
public class ProxyTest {
public static void main(String[] args) {
Target target = new Target();
Boost boost = new Boost();
Enhancer enhancer = new Enhancer();
//设置目标父类
enhancer.setSuperclass(target.getClass());
//设置回调
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
boost.before();
Object invoke = method.invoke(target, objects);
boost.after();
return invoke;
}
});
//创建代理对象
Target pr0oxy = (Target) enhancer.create();
proxy.run();
}
}
4.输出结果`
增强前...
target running...
增强后...
**注意:**,在此种代理方式中代理对象和目标对象是父子关系,jdk和cglib代理方式在匿名内部类中所实现的东西是一样的