java 动态代理范例 InvocationHandler与Proxy,拦截与代理
(2011-04-22 19:19:23) 标签: 接口helloworld代理it | 分类: 技术引用 |
java.lang.reflect.Proxy,
Proxy 提供用于创建动态代理类和实例的静态方法.
newProxyInstance()
返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序
(详见api文档)
java.lang.reflect.InvocationHandler,
InvocationHandler 是代理实例的调用处理程序 实现的接口。
invoke()
在代理实例上处理方法调用并返回结果。在与方法关联的代理实例上调用方法时,将在调用处理程序上
调用此方法。
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
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 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(); -
} - }
- 方法调用前。。。
- Hello
World! - 方法调用结束