java 动态代理范例 InvocationHandler与Proxy,拦截与代理
来源:互联网 发布:库存sql和access的区别 编辑:程序博客网 时间:2024/05/16 17:23
java 动态代理范例 InvocationHandler与Proxy,拦截与代理 (转载)
JDK1.2以后提供了动态代理的支持,程序员通过实现java.lang.reflect.InvocationHandler接口提供一个拦截处理器,然后通过java.lang.reflect.Proxy得到一个代理对象,通过这个代理对象来执行商业方法,在商业方法被调用的同时,执行处理器会被自动调用。
Java动态代理只能对实现了接口的类生成代理,不能针对类。其实现主要是通过java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。Proxy类主要用来获取动态代理对象,InvocationHandler接口用来约束调用者实现。
接口类源代码:
- publicinterface HelloWorld {
- publicvoid sayHelloWorld();
- }
public interface HelloWorld {public void sayHelloWorld();}
实现类源代码:
- publicclass HelloWorldImplimplements HelloWorld {
- publicvoid sayHelloWorld() {
- System.out.println("Hello World!");
- }
- }
public class HelloWorldImpl implements HelloWorld {public void sayHelloWorld() {System.out.println("Hello World!");}}
拦截器源代码:
- publicclass HelloWorldHandlerimplements InvocationHandler {
- //目标对象
- private Object targetObject;
- public HelloWorldHandler(Object targetObject){
- this.targetObject = targetObject;
- }
- public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
- System.out.println("方法调用前。。。");
- Object result = method.invoke(this.targetObject, args);
- System.out.println("方法调用结束");
- return result;
- }
- }
public class HelloWorldHandler implements InvocationHandler {//目标对象private Object targetObject;public HelloWorldHandler(Object targetObject){this.targetObject = targetObject;}public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("方法调用前。。。");Object result = method.invoke(this.targetObject, args);System.out.println("方法调用结束");return result;}}
测试代码:
- publicclass HelloWorldTest {
- publicstaticvoid main(String[] args) {
- //业务对象
- HelloWorld obj = new HelloWorldImpl();
- //拦截器对象
- HelloWorldHandler handler = new HelloWorldHandler(obj);
- //返回业务对象的代理对象
- HelloWorld proxy = (HelloWorld)Proxy.newProxyInstance(
- obj.getClass().getClassLoader(),
- obj.getClass().getInterfaces(),
- handler);
- //通过代理对象执行业务对象的方法
- proxy.sayHelloWorld();
- }
- }
public class HelloWorldTest {public static void main(String[] args) {//业务对象HelloWorld bj = new HelloWorldImpl();//拦截器对象HelloWorldHandler handler = new HelloWorldHandler(obj);//返回业务对象的代理对象IHelloWorld proxy = (IHelloWorld)Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), handler);// IHelloWorld 原文使用 HelloWorld,但类型转换出错,所以使用接口。//通过代理对象执行业务对象的方法proxy.sayHelloWorld();}}
测试结果:
- 方法调用前。。。
- Hello World!
- 方法调用结束
- java 动态代理范例 InvocationHandler与Proxy,拦截与代理
- java 动态代理范例 InvocationHandler与Proxy
- Java动态代理借助Proxy与InvocationHandler实现
- Java动态代理的源码分析;Proxy与InvocationHandler
- java动态代理-InvocationHandler Proxy
- Java动态代理InvocationHandler+Proxy
- 动态代理 Proxy InvocationHandler
- 动态代理proxy ,InvocationHandler
- 动态代理 Proxy InvocationHandler
- java 动态代理学习(Proxy,InvocationHandler)
- java 动态代理深度学习(Proxy,InvocationHandler)
- java 动态代理学习(Proxy,InvocationHandler)
- JAVA动态代理实现 Proxy InvocationHandler
- JAVA JDK 动态代理 proxy invocationHandler
- java 动态代理深度学习(Proxy,InvocationHandler)
- Java 动态代理(proxy、invocationHandler)
- Java动态代理用法(Proxy + InvocationHandler)
- java 动态代理学习(Proxy,InvocationHandler)
- C#:读取csv文件,保存为csv文件
- malloc/free与new/delete的区别与联系
- OpenStack块存储nova-volume工作机制和相关问题--有点老可以看看
- ccmlt 2013 V2.0012
- android AsyncTask介绍
- java 动态代理范例 InvocationHandler与Proxy,拦截与代理
- VS2008中生成lib和dll库文件
- 表索引是不是越多越好?
- ios实现类似魔兽小地图功能 在
- google play 解锁
- android用WebView显示包含文字和图片的本地网页(支持放大缩小)
- Linux下which、whereis、locate、find 区别
- CBrush类的详解
- Unity 通过点击屏幕控制人物移动。