您的位置:首页 > 编程语言 > Java开发

java 动态代理范例 InvocationHandler与Proxy,拦截与代理

2013-07-20 15:23 423 查看
java 动态代理范例 InvocationHandler与Proxy,拦截与代理 (转载)

JDK1.2以后提供了动态代理的支持,程序员通过实现java.lang.reflect.InvocationHandler接口提供一个拦截处理器,然后通过java.lang.reflect.Proxy得到一个代理对象,通过这个代理对象来执行商业方法,在商业方法被调用的同时,执行处理器会被自动调用。

Java动态代理只能对实现了接口的类生成代理,不能针对类。其实现主要是通过java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。Proxy类主要用来获取动态代理对象,InvocationHandler接口用来约束调用者实现。

接口类源代码:

Java代码

public
interface HelloWorld {

public
void sayHelloWorld();

}

public interface HelloWorld {
public void sayHelloWorld();
}


实现类源代码:

Java代码

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!");
}
}


拦截器源代码:

Java代码

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;
}
}


测试代码:

Java代码

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();
}
}


测试结果:

Html代码

方法调用前。。。
Hello World!
方法调用结束
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: