-
概念:用一个类,简介执行另一个类中的方法或引用其成员。
-
分类:静态代理和动态代理
动态代理 -
动态代理的两种基本实现手法:
-
JDK代理机制:使用JDK提供的代理类并且基于接口。
@SuppressWarnings("unchecked")//不需要检测其类型是否匹配
public static T getProxy(Object object) {
Class>klass = object.getClass();//获取object对象的类
ClassLoader classLoader = klass.getClassLoader();//类加载器
Class>[] interfaces = klass.getInterfaces();//获得接口
return (T) Proxy.newProxyInstance(classLoader, interfaces, new InvocationHandler() {
//InvocationHandler()句柄:实质是接口
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
System.out.println("在执行方法" + method + "之前做一件事成为:前置拦截!");
result = method.invoke(object, args);
System.out.println("在执行方法" + method + "之后做一件事成为:后置拦截!");
return result;
}
});
}
以上是JDK代理机制的简单实现。
总结:
1.先用一个接口的实现类产生一个对象,然后把这个对象传递到getProxy();中生成一个代理对象。用代理对象来调用接口实现类中的方法。*
2.JDK代理机制在使用时要注意两个问题:
被代理的对象必须是至少一个接口的实现类对象
得到的代理对象,应该是某一接口类型的
- CGLIB代理机制:不必基于接口,其本质是以被代理对象作为基类,产生的派生类的对象。
但是,如果被代理对象的类用final修饰,即,这个类本身不允许派生子类,则,这样的类是不能被代理的。
@SuppressWarnings("unchecked")//不关心返回值类型的一致性问题
public static T getProxy(Object object) {
Class> superclass = object.getClass();
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(superclass);
enhancer.setCallback(new InvocationHandler() {
//setCallback回调函数
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
System.out.println("在执行方法" + method + "之前做一件事成为:前置拦截!");
result = method.invoke(object, args);
System.out.println("在执行方法" + method + "之后做一件事成为:后置拦截!");
return result;
}
});
return (T)enhancer.create();
}
优点:不依赖于接口。
代理机制完成的功能之一是:能够对已经实现的代码进行“非侵入式”扩展。



