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();
}
实现类源代码:
Java代码
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;
}
}
测试代码:
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();
}
}
测试结果:
Html代码
方法调用前。。。
Hello World!
方法调用结束
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!
方法调用结束
相关文章推荐
- java 动态代理范例 InvocationHandler与Proxy
- java 动态代理范例 InvocationHandler与Proxy
- java 动态代理范例 InvocationHandler与Proxy
- Java动态代理的源码分析;Proxy与InvocationHandler
- Java Proxy和CGLIB动态代理原理
- Java动态代理一------动态类Proxy的使用
- Java动态代理--动态类Proxy的使用
- java 动态代理深度学习(Proxy,InvocationHandler),含$Proxy0源码
- java动态代理,proxy和cglib
- 设计模式(3)-结构型-代理模式(proxy)以及java动态代理的两种方式
- java中Proxy(代理与动态代理)
- Java动态代理一——动态类Proxy的使用
- Java动态代理一——动态类Proxy的使用
- java 动态代理深度学习(Proxy,InvocationHandler),含$Proxy0源码(转)
- Java动态代理一——动态类Proxy的使用
- java 动态代理深度学习(Proxy,InvocationHandler)(转载)
- 【Java深入研究】5、Proxy动态代理机制详解
- java中的动态代理Proxy实现AOP
- 设计模式(3)-结构型-代理模式(proxy)以及java动态代理的两种方式
- Java动态代理(一)动态类Proxy的使用