动态代理
- 动态代理:使用一个代理将对象包装起来 ,然后用该代理对象取代原始的代理;
- 在面对原始对象上 的调用都要通过代理
- 代理对象决定是否以及何时将方法调用转到原始对象上
静态代理 & 动态代理 例子
静态代理
interface ClothFactory{
void produceCloth();
}
class ProxyClothFactory implements ClothFactory{
private ClothFactory clothFacory;
public ProxyClothFactory(ClothFactory clothFacory) {
this.clothFacory=clothFacory;
}
@Override
public void produceCloth() {
System.out.println("代理工厂执行一些方法。。。");
clothFacory.produceCloth();
System.out.println("代理工厂执行操作");
}
}
class NikeClothFactory implements ClothFactory{
@Override
public void produceCloth() {
System.out.println("Nike factory...");
}
}
public class StaticProxyTest {
public static void main(String[] args) {
NikeClothFactory nikeClothFactory=new NikeClothFactory();
ProxyClothFactory proxyClothFactory=new ProxyClothFactory(nikeClothFactory);
proxyClothFactory.produceCloth();
}
}
动态代理例子
interface Human{
String getBelied();
void eat(String food) ;
}
class SuperMan implements Human{
@Override
public String getBelied() {
return "I believe T can fly!";
}
@Override
public void eat(String food) {
System.out.println("like eat :"+food);
}
}
class ProxyFactory{
public static Object getProxyInstance(Object obj) {
MyInvocationHandler handler=new MyInvocationHandler();
handler.bind(obj);
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(),handler );
}
}
class MyInvocationHandler implements InvocationHandler{
private Object obj;
public void bind(Object obj) {
this.obj=obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(obj, args);
}
}
public class ProxyTest {
public static void main(String[] args) {
SuperMan superMan=new SuperMan();
Human proxyInstance=(Human)ProxyFactory.getProxyInstance(superMan);
String belief=proxyInstance.getBelied();
System.out.println(belief);
proxyInstance.eat("川菜");
}
}