您的位置:首页 > 编程语言 > Java开发

代理类的实现

2016-05-27 10:14 411 查看
代理类分为两种:

1:静态代理,即在编译时期就确定的。个人理解就是对被代理类的一层包装,打个比方:如果你的老妈做饭要用到酱油,老妈总会让你去替她打酱油,而不是她直接去。(此处只是形象化的理解,其实深入比喻不是太恰当)。

2:动态代理,即需要在运行时期才能确定代理的是什么类。用到了反射的相关知识,此处要理解需要补一些反射知识。

以下是我实现的两种代理类,可对比看这样比较容易理解:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//被代理类接口
interface Animal {
void run();
}

// 实现了Animal接口的被代理类
class Rabbit implements Animal {

@Override
public void run() {
System.out.println("Rabbit is running !!!");
}

}

// 静态实现代理类
class ProxyClass implements Animal {
// 被代理类对象
Animal ani;

public ProxyClass(Animal ani) {
super();
this.ani = ani;
}

// 对run()方法的重写实际 上是对被代理类的方法调用,也即实现了包装代理。
@Override
public void run() {
System.out.println("ProxyClass's run() running!!!");
ani.run();
}

}

// 实现动态代理的类
class MyInvocationHandler implements InvocationHandler {
Object object;// 被代理类实例

// 首先要返回一个代理类对象
public Object blind(Object object) {

this.object = object;
return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), this);
}

// 可理解为被代理类重写的方法,当通过代理类对被代理类重写方法的主调用时,会调用些方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(object, args);
}

}

// TEST
public class ProxyTest {
public static void main(String[] args) {
// 实例化一个被代理类
Rabbit r = new Rabbit();

// 静态代理测试
System.out.println("静态代理:");
// 实例化一个静态代理类的对象
ProxyClass pc = new ProxyClass(r);
pc.run();
// -------------------------------------------------------------------
// 动态代理测试
System.out.println("动态代理:");
// 创建一个实现了InvocationHandler接口的实例对象
MyInvocationHandler mh = new MyInvocationHandler();
// 调用blind()方法,返回一个代理类
Animal proxyRabbit = (Animal) mh.blind(r);
// 对invoke()方法的调用
proxyRabbit.run();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java