在动态代理中动态代理类不再服务于特定的对象与接口,而是服务于他绑定的对象,绑定是动态的。而实际工作的类也不插入任何和业务无关的动作。要调用是,绑定他即可。
接口类:IBuySome.java
package org.kangsg219.DynamicProxy;
public interface IBuySome {
public void buy();
public void buy(String something);
}
被代理对象:BuySomeImpl.java
package org.kangsg219.DynamicProxy;
public class BuySomeImpl implements IBuySome {
public void buy() {
System.out.println("买个手机。(BuySomeImpl类中的buy方法。)");
}
public void buy(String something) {
System.out.println("买个"+something+"。(BuySomeImpl类中的buy方法。)");
}
}
代理对象:BuySomeProxy.java
package org.kangsg219.DynamicProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class BuySomeProxy implements InvocationHandler{
private Object obj;
public Object bind(Object obj){
this.obj=obj;
/**
* java.lang.reflect.Proxy中的方法
* arg0 - 定义代理类的类加载器
* arg1 - 代理类要实现的接口列表
* arg2 - 指派方法调用的调用处理程序
*/
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
}
/**
* 实现InvocationHandler接口中的方法。
* arg0:被绑定对象。
* arg1:被绑定对象的方法(如TestMain中的buy方法)。
* arg2:被绑定对象的方法的参数组,是个可变参数(如buy中的String类型的"手机");
* 如果没有参数则arg2为null。
*/
public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable {
this.beforBuy();
return arg1.invoke(obj, arg2);//java.lang.reflect.Method类中的方法
}
public void beforBuy(){
System.out.println("在买东西前执行的一些动作。(BuySomeProxy类中附加的方法。)");
}
public void afterBuy(){
System.out.println("在买东西前执行的一些动作。(BuySomeProxy类中附加的方法。)");
}
}
测试类:TestMain.java
package org.kangsg219.DynamicProxy;
/**
* @author kangsg219
*
* 测试类
*/
public class TestMain {
public static void main(String[] args) {
BuySomeProxy bsp=new BuySomeProxy();
IBuySome ibs=(IBuySome)bsp.bind(new BuySomeImpl());
ibs.buy("手机");//调用BuySomeProxy中的invoke方法。
}
}
运行结果:
在买东西前执行的一些动作。(BuySomeProxy类中附加的方法。)
买个手机。(BuySomeImpl类中的buy方法。)