Java动态代理借助Proxy与InvocationHandler实现
来源:互联网 发布:exists sql 编辑:程序博客网 时间:2024/05/16 12:17
Java 自带实现类的动态代理机制是基于接口(interface)的!也就是说类A要能实现动态代理,首先要实现一个接口proxyInterface(proxyInterface是随意命名的,这里代表要用作构建代理的接口),然后再在接口proxyInterface的基础上构建代理类。
构建方法:
Java 使用自带的Proxy类,以及InvocationHandler接口,可以实现动态的构造一个类A的代理示例对象A1,
(一)实例:
(1)首先建一个接口ProxyInterface
//用作构建代理的接口
package com.langsin.proxy;
//用作构建代理的接口
publicinterface ProxyInterface {
publicint sum(int a,int b);
}
(2) 构建要代理的类A
package com.langsin.proxy;
publicclass A implements ProxyInterface{
intvalue;
public A() {
//TODO Auto-generated constructor stub
}
publicint sum(int a,int b) {
//TODO Auto-generated method stub
value=a+b;
returnvalue;
}
}
(3)实现动态构建代理得类 CommonsProxy
package com.langsin.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
publicclass CommonsProxy implements InvocationHandler {
Object realObj;
//构造函数赋值参数obj为要构建代理对象的类的对象
public CommonsProxy(Object obj) {
//TODO Auto-generated constructor stub
this.realObj=obj;
}
public Object getProxyObj(){
//Proxy.newProxyInstance(ClassLoader loader, Class[] interface,、、、、//InvocationHandler h)
//要求loader必须能加在ProxyInterface,这里realObj的原对象实现了//ProxyInterface所以realObj自身的类加载器一定能
//加载ProxyInterface,h为实际执行函数调用的InvocationHandler实现对象。
return Proxy.newProxyInstance(realObj.getClass().getClassLoader(),new Class[]{ProxyInterface.class},this);
}
//实现自InvocationHandler的方法
//实际代理类的方法执行通过调用此函数实现
public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
//TODO Auto-generated method stub
Object obj=method.invoke(this.realObj, args);
return obj;
}
}
(4)进行测试: TestProxy类测试
package com.langsin.proxy;
publicclass TestProxy {
publicstaticvoid main(String[] args){
A a=new A();
CommonsProxy proxy=new CommonsProxy(a);
ProxyInterface proxyIns=(ProxyInterface)proxy.getProxyObj();
int result=proxyIns.sum(100, 200);
System.out.println("代理类执行的结果为:"+result);
}
}
运行结果:
“代理类执行的结果为:300”
(二)要点注意:
以上例子中的
Proxy.newProxyInstance(realObj.getClass().getClassLoader(),new Class[]{ProxyInterface.class},this);
还可以代替为:
Proxy.newProxyInstance(ProxyInterface.class.getClassLoader(),new Class[]{ProxyInterface.class},this);
或者代替为:
Proxy.newProxyInstance(realObj.getClass().getClassLoader(),realObj.getClass().getInterfaces,this);
但此种方式不行:
(1)Class [] classes=new Class []{ProxyInterface.class };
Proxy.newProxyInstance(ProxyInterface.class.getClassLoader(),new Cclasses ,this);
或者
(2)Class [] classes= realObj.getClass().getInterfaces;
Proxy.newProxyInstance(ProxyInterface.class.getClassLoader(),classes , this);
分析 Class类是所有“对象.getClass()”的父类,本质上与子类对象体内容构造是有很大不同的,两者是不等价的。所以不能以此种方式代替!
(三)另一种复杂的构建方式
注:原类A与接口(CommonsProxy)原封不动
(1)实现动态构建代理得类 CommonsProxy
package com.langsin.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
publicclass CommonsProxy implements InvocationHandler {
Object realObj;
// 构造函数赋值参数obj为要构建代理对象的类的对象
public CommonsProxy(Object obj) {
//TODO Auto-generated constructor stub
this.realObj=obj;
}
//实现自InvocationHandler的方法
//实际代理类的方法执行通过调用此函数实现
public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
//TODO Auto-generated method stub
Object obj=method.invoke(this.realObj, args);
return obj;
}
}
(2)在测试运行时直接生成代理类:TestProxy类测试
package com.langsin.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Proxy;
publicclass TestProxy {
publicstaticvoid main(String[] args) {
A a=new A();
//首先建建立执行代理的对象proxy
CommonsProxy proxy=new CommonsProxy(a);
//直接建出接口的proxyClass代理Class 对象
// 利用Proxy.getProxyClass(ClassLoader loader,Class<?>... interfaces)
//创建
Class proxyClass=Proxy.getProxyClass(ProxyInterface.class.getClassLoader(),new Class[]{ ProxyInterface.class} );
ProxyInterface proxyIns;
try {
//通过反射构造函数Constructor类对象的newInstance(Object... initargs)方法
//(因Proxy有一个Proxy(InvocationHandler h)构造方法
//建出最终的代理类对象proxyIns
proxyIns = (ProxyInterface)proxyClass.
getConstructor(new Class[]{InvocationHandler.class})
.newInstance(proxy);
int result=proxyIns.sum(100, 200);
System.out.println("代理类执行的结果为:"+result);
} catch (IllegalArgumentException e) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果:
代理类执行的结果为:300
- Java动态代理借助Proxy与InvocationHandler实现
- JAVA动态代理实现 Proxy InvocationHandler
- java 动态代理范例 InvocationHandler与Proxy
- java动态代理-InvocationHandler Proxy
- Java动态代理InvocationHandler+Proxy
- java 动态代理范例 InvocationHandler与Proxy,拦截与代理
- java动态代理实现Proxy和InvocationHandler cglib
- Java动态代理的源码分析;Proxy与InvocationHandler
- 动态代理 Proxy InvocationHandler
- 动态代理proxy ,InvocationHandler
- 动态代理 Proxy InvocationHandler
- java 动态代理学习(Proxy,InvocationHandler)
- java 动态代理深度学习(Proxy,InvocationHandler)
- java 动态代理学习(Proxy,InvocationHandler)
- JAVA JDK 动态代理 proxy invocationHandler
- java 动态代理深度学习(Proxy,InvocationHandler)
- Java 动态代理(proxy、invocationHandler)
- Java动态代理用法(Proxy + InvocationHandler)
- android 常见死机问题--log分析
- POJ 1679 The Unique MST(简单题)
- POJ 2080 Calender -- from lanshui_Yang
- 堆与栈结合代码和汇编解释
- Java基础搜集
- Java动态代理借助Proxy与InvocationHandler实现
- C#List随机交换取数据(C#实现的洗牌算法)
- 安装hadoop-lzo
- easyUI 添加CheckBox选择到DataGrid
- sql优化和注意事项
- 数据结构--二叉树--节点的修改(链式结构--队列)
- 谈谈JavaScript MVC模式
- Android获取本机IP地址(不是localhost)和MAC的方法
- Qt使用QGraphicsView实现滑动窗体效果