Let's Go!
java 动态代理范例 InvocationHandler与Proxy,拦截与代理 (转载)
上一篇 /
下一篇 2011-02-23 17:51:05
/ 个人分类:JAVA学习&编程相关
java 动态代理范例 InvocationHandler与Proxy,拦截与代理 (转载)
JDK1.2以后提供了动态代理的支持,程序员通过实现java.lang.reflect.InvocationHandler接口提供一个拦截处理器,然后通过java.lang.reflect.Proxy得到一个代理对象,通过这个代理对象来执行商业方法,在商业方法被调用的同时,执行处理器会被自动调用。
Java动态代理只能对实现了接口的类生成代理,不能针对类。其实现主要是通过java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。Proxy类主要用来获取动态代理对象,InvocationHandler接口用来约束调用者实现。
接口类源代码:
- public interface HelloWorld {
- public void sayHelloWorld();
- }
public interface HelloWorld {
public void sayHelloWorld();
}
实现类源代码:
- public class HelloWorldImpl implements HelloWorld {
- public void sayHelloWorld() {
- System.out.println("Hello World!");
- }
- }
public class HelloWorldImpl implements HelloWorld {
public void sayHelloWorld() {
System.out.println("Hello World!");
}
}
拦截器源代码:
- 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;
- }
- }
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;
}
}
测试代码:
- public class HelloWorldTest {
- public static void 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!
- 方法调用结束
方法调用前。。。
Hello World!
方法调用结束
http://chenjumin.javaeye.com/blog/339554
代码打包:
com.rar(1.8 KB)
收藏
举报
TAG: