动态代理是在不改变原来方法的代码的前提下,用来增强原来方法的功能的。
在程序的角度上来说,就是说让别人来帮助自己完成更加强的功能,别人就是动态代理对象。
java中的动态代理由两个核心的组件来完成,一个是InvocationHandler接口还有Proxy对象。两个组件都是在java.until.reflect包下边。
实现的步骤
1.先创建一个接口,用来申明所要实现的方法
2.然后创建一个实现类来实现该接口中的方法,这一步就是实现基本功能。注意,Java中规定凡是实现接口的,必须要实现该接口中所有的方法。
3.然后再创建一个实现类,实现InvocationHandler接口中的invoke方法。这一步要在构造方法中传入所要代理的目标对象,也就是增强方法所在的类,一般传入第一步的接口。首先通过反射技术反射出该类,然后实现增强的逻辑。最后返回调用方法的返回值。
4.创建Proxy代理对象。Proxy.newProxyInstense(第二步的实现类的classloader,第二步的实现类的接口数组,第三步的InvocationHandler接口实现类);
5.调用第四部的代理对象中的方法
第一步:创建一个卖酒的接口
package cn.liuxw.proxy2;
public interface SellWine {
public abstract Integer sellWine();
}
第二步:创建一个实现买酒方法的基本实现类
package cn.liuxw.proxy2;
public class sellWineImpl implements SellWine{
@Override
public Integer sellWine() {
// TODO Auto-generated method stub
return 10;
}
}
第三步:创建实现一个Invocationhandler接口的增强功能的实现类,用来涨价
package cn.liuxw.proxy2;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class myJavaProxyImpl implements InvocationHandler{
private SellWine obj;//目标对象
public myJavaProxyImpl(SellWine obj) {
// TODO Auto-generated constructor stub
this.obj = obj;
}
@Override
/**
* @param1 所要代理的目标对象
* @param2 此方法对象通过反射来反射目标对象
* @param3 所要传的参数
* @return 返回对目标对象功能加强后的处理结果
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("中华酒涨价了!");
Integer proxy1 = (Integer)method.invoke(obj, args)+10;
System.out.println("原价是:"+method.invoke(obj, args));
System.out.println("涨价后的价格是:"+proxy1);
return proxy1;
}
}
第五步:创建Proxy的代理对象并且测试怎么用,用来显示
package cn.liuxw.proxy2;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class ProxyTest {
public static void main(String[] args) {
SellWine sWine = new sellWineImpl();//目标代理对象做基本的功能
InvocationHandler p = new myJavaProxyImpl(sWine);
SellWine object = (SellWine)Proxy.newProxyInstance(sWine.getClass().getClassLoader(),sWine.getClass().getInterfaces(), p);
//功能加强后的代理类对象
object.sellWine();
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)