java 动态代理(cglib)
动态代理:代理类绑定Class对象,来实现为不同的类或者接口创建代理对象
*******************************
相关类及接口
Enhancer:对象增强类
public class Enhancer extends AbstractClassGenerator {
********
构造方法
public Enhancer() {
********
常用方法
public void setSuperclass(Class superclass) { //设置父类
public void setInterfaces(Class[] interfaces) { //设置上层接口
public void setCallback(Callback callback) { //设置回调函数
public Object create() { //创建代理对象
MethodInterceptor:方法拦截接口
public interface MethodInterceptor extends Callback {
Object intercept(Object var1, Method var2, Object[] var3, MethodProxy var4) throws Throwable;
//var1为代理对象、var2为被代理对象方法、var3为方法参数、var4为代理对象的代理方法
}
*******************************
示例
interface A1{
void fun1();
}
interface A2{
void fun2();
}
class RealA1Object implements A1{
@Override
public void fun1() {
System.out.println("真实对象A1");
}
}
class RealA2Object implements A2{
@Override
public void fun2() {
System.out.println("真实对象A2");
}
}
class Proxy2Object implements MethodInterceptor {
public Object getProxy(Class clz){
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass(clz);
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("代理对象开始调用");
methodProxy.invokeSuper(o,objects);
System.out.println("代理对象调用结束\n");
return null;
}
}
public class MyTest2 {
public static void main(String[] args){
Proxy2Object proxy2Object=new Proxy2Object();
A1 a1=(A1)proxy2Object.getProxy(RealA1Object.class);
a1.fun1();
A2 a2=(A2)proxy2Object.getProxy(RealA2Object.class);
a2.fun2();
}
}
*****************
控制台输出
代理对象开始调用
真实对象A1
代理对象调用结束
代理对象开始调用
真实对象A2
代理对象调用结束