//1.先定义一个接口
public interface Demo {
void parent();
void child();
}
//2.接口的实现类
public class DemoImpl implements Demo {
/**
* 预期结果
* ==========代理中增加了额外的处理逻辑===========
* ==========代理中增加了额外的处理逻辑===========
* ========child===========
* ========parent==========
*
* 实际结果child没有被代理
* ==========代理中增加了额外的处理逻辑===========
* ========child===========
* ========parent==========
*/
@Override
public void parent() {
this.child();
System.out.println("========parent=========");
}
@Override
public void child() {
System.out.println("========child===========");
}
}
/**
* JDK动态代理
*/
public class Myhandler implements InvocationHandler {
private Object target;
public Myhandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
//做一些额外的增强的处理
//例如:记录日志,操作权限,事务处理
System.out.println("==========代理中增加了额外的处理逻辑===========");
return method.invoke(target,args);
}
//测试
public static void main(String[] args) {
Myhandler handler = new Myhandler(new DemoImpl());
Demo proxy = (Demo) Proxy.newProxyInstance(Myhandler.class.getClassLoader(),new Class[]{Demo.class},handler);
proxy.parent();
// proxy.child();
}
}
执行结果
得出结论:只有代理对象直接调用,这个对象才能被代理
当对象是一个普通的class时使用的时CGLIB实现,如果是一个接口使用JDK动态代理。