package com.atguigu.java; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; interface Human { String getBelief(); void eat(String food); } //被代理类 class SuperMan implements Human { @Override public String getBelief() { return "I believe I can fly!"; } @Override public void eat(String food) { System.out.println("我喜欢吃" + food); } } //代理类 class ProxyFactory{ //调用此方法,返回一个代理类的对象 public static Object getProxyInstance(Object object){//被代理类的对象 MyInvocationHandler handler = new MyInvocationHandler(); handler.bind(object); return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(),handler); } } class MyInvocationHandler implements InvocationHandler{ private Object object;//需要使用被代理类的对象进行赋值 public void bind(Object object){ this.object = object; } //当我们通过代理类的对象,调用方法a时,就会自动的调用如下的方法:invoke() //将被代理类要执行的方法a的功能就声明在invoke()中 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //method:即为代理类对象调用的方法,此方法也就作为了被代理对象要调用的方法 //obj:被代理类的对象 Object returnValue = method.invoke(object, args); //上述方法的返回值就作为当前类中的invoke()的返回值 return returnValue; } } public class ProxyTest { public static void main(String[] args) { SuperMan superMan = new SuperMan(); //proxyInstance:代理对象 Human proxyInstance = (Human) ProxyFactory.getProxyInstance(superMan); String belief = proxyInstance.getBelief(); System.out.println(belief); proxyInstance.eat("四川麻辣烫"); System.out.println("**********"); NikeClothFactory nike = new NikeClothFactory(); ClothFactory proxyInstance1 = (ClothFactory) ProxyFactory.getProxyInstance(nike); proxyInstance1.produceCloth(); } }
package com.atguigu.java; interface ClothFactory{ void produceCloth(); } //代理类 class ProxyClothFactory implements ClothFactory{ private ClothFactory factory;//用被代理类对象进行实例化 public ProxyClothFactory(ClothFactory factory){ this.factory = factory; } @Override public void produceCloth() { System.out.println("代理工厂做一些准备工作"); factory.produceCloth(); System.out.println("代理工厂做一些后续的收尾工作"); } } //被代理类 class NikeClothFactory implements ClothFactory{ @Override public void produceCloth() { System.out.println("Nike工厂生产一批运动服"); } } public class StaticProxyTest { public static void main(String[] args) { //创建被代理类的对象 NikeClothFactory nike = new NikeClothFactory(); //创建代理类对象 ProxyClothFactory proxyClothFactory = new ProxyClothFactory(nike); proxyClothFactory.produceCloth(); } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)