/**
- 公共接口,统一定义代理类和被代理类的行为
- @author GC-HANK
/
public interface CommInterface2 {
/*
- 购买情趣娃娃
- @param size 娃娃的尺寸
*/
abstract void buyWomenTools(int size);
}
/**
- 真实对象
- @author GC-HANK
*/
public class RealInstance implements CommInterface {
@Override
public void buyManTools(int size) {
System.out.println(“购买男性用品:size” + size);
}
}
/**
- 真实对象
- @author GC-HANK
*/
public class RealInstance2 implements CommInterface2 {
@Override
public void buyWomenTools(int size) {
System.out.println(“购买女性用品::size” + size);
}
}
OK,代码贴完了,现在开始实例讲解:
上面的代码,是在模拟XX用品销售,男用、女用的分别用两个接口来定义,为了定义这两个功能,我用了两个接口,并且用两个实现类分别实现了这两个接口。
DynamicProxyInstance .java
则 是代理类,外界(也就是这里的static void main
函数)通过该代理类来进行购买动作.
准备开车,踩油门!
请看这段代码,它是new出了一个proxy的Object,并且return出去
public Object getProxyInstance() {
return Proxy.newProxyInstance(realInstance.getClass().getClassLoader(), realInstance.getClass().getInterfaces(),
this);
// 那么这个对象到底是如何创建出来的呢?
}
而,拿到这个对象之后,强转为了CommInterface
// 先看看这个对象在debug的时候,是怎么样的一个对象引用
CommInterface commInterface = (CommInterface) instance.getProxyInstance();
commInterface.buyManTools(30);
为什么它可以强转为 CommInterface?因为instance.init(new RealInstance());
这一句当中,RealInstance
是CommIntance
的子类。从结果上来看,通过getInstance
方法拿到的Object,直接就具备realInstance
的功能. 那这个Object
到底是什么东西?它是如何生成的?
回到getInstance()
方法,通过debug
,我们发现,
它是一个