java动态代理的使用
来源:互联网 发布:hive sql contains 编辑:程序博客网 时间:2024/05/09 19:03
由于动态代理是针对接口的,所以首先需要声明一个接口,该测试接口如下所示
public interface TestI {void test();}
有了接口,就要有实现类,实现类如下所示
public class TestImpl implements TestI {@Overridepublic void test() {System.out.println("目标方法");}}
要使用动态代理,就要创建一个代理类,该代理类实现InvocationHandler,并实现对应的方法
public class TestProxy implements InvocationHandler {private Object tarObj;public TestProxy() {}public TestProxy(Object tarObj) {this.tarObj = tarObj;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("目标方法之前进行操作");method.invoke(tarObj, args);System.out.println("目标方法之前进行操作");return null;}}
invoke为实现的方法,该方法不需要自己调用,当产生好代理对象后,调用目标方法的时候,这个方法会被自动调用,各个参意义如下
proxy:代理对象(也就是下面主方法里的testProxy)
method:该method就是将要调用的真正的方法的Method对象,打印出来的结果是:
public abstract void asdasd.TestI.test()
(这个和反射机制的method是一回事,具体实现可以看反射机制的相关知识)
args:目标方法对应参数的数组
写好了代理类,接着就是使用了,为了方便,直接在TestProxy类中创建main方法进行测试,该类完整代码如下:
public class TestProxy implements InvocationHandler {//所要代理的真实的对象private Object tarObj;public TestProxy() {}public TestProxy(Object tarObj) {this.tarObj = tarObj;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("目标方法之前进行操作");//利用反射机制调用真实对象的方法method.invoke(tarObj, args);System.out.println("目标方法之后进行操作");return null;}public static void main(String[] args) {TestImpl testImpl = new TestImpl();TestProxy testProxy = new TestProxy(testImpl);TestI testI = (TestI) Proxy.newProxyInstance(TestI.class.getClassLoader(), new Class[]{TestI.class}, testProxy);testI.test();}}
首先创建一个目标对象,即testImpl
接着当成参数传递给代理类,以此来创建一个代理对象,此
newProxyInstance方法返回一个代理对象,该方法有3个参数,意义如下:
ClassLoader:指定由动态代理产生的类由哪个类加载器来加载
Class[]:由动态代理产生的类的class数组(需要是接口)
InvocationHandler:实现InvocationHandler的接口的类的对象
运行程序输出的结果如下:
目标方法之前进行操作
目标方法
目标方法之后进行操作
就这样,一个动态代理的小实例就写好了
ps:
主方法中的testI不是真正的对象,而是一个代理对象,执行System.out.println(testI.getClass().getName());输出的结果如下
com.sun.proxy.$Proxy0
这就是一个代理对象,除非是代理不同类的对象,所产生的Proxy*才会出现序号不同的情况,如果仅仅是再次使用newProxyInstance来创建一个新的代理对象,那么序号还是一样的
- java动态代理的使用
- java:动态代理的使用
- Java动态代理使用
- java动态代理使用
- [转]JAVA动态代理的使用
- Java中动态代理的使用
- java动态代理与cglib代理的简单使用
- 动态代理的使用
- Java动态代理一------动态类Proxy的使用
- Java动态代理--动态类Proxy的使用
- Java的动态代理
- JAVA的动态代理
- java的动态代理
- java的动态代理
- JAVA的动态代理
- JAVA的动态代理
- JAVA的动态代理
- JAVA的动态代理
- 黑马程序员—Java学习笔记之集合框架(一)
- 检测dll是32/64位 ?
- Android 线程超时的例子
- Android·HTTP超时机制
- 使用ZooKeeper实现的两个实例
- java动态代理的使用
- 基于matlab标定数据,使用opencv实现双目立体摄像头的标定(源代码)
- 55 br This fal
- WIN7网关问题问题“在释放接口 Loopback Pseudo-Interface 1 时出错: 系统找不到指定的文件。操作失败,没有适配器处于允许此操作的状态”解决方案
- 9、如何自学Struts2之Struts2文件上传和数据库访问[视频]
- UVA1606 Amphiphilic Carbon Molecules
- The gulf can be wide
- such as Peggy Gerag
- UI知识点总结