java 动态代理
来源:互联网 发布:云计算需要的设备 编辑:程序博客网 时间:2024/04/29 17:20
所谓Dynamic Proxy是这样一种class:
它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然啦,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。
package com.laos.javassist;
public interface Service {
public void serviceMethod(String parameter);
}
package com.laos.javassist;
public interface ServiceCallback {
public void doCallback();
}
ServiceConsumer 类实现了Service接口和ServiceCallback接口
package com.laos.javassist;
public class ServiceConsumer implements ServiceCallback,Service {
public void doCallback() {
System.out.println("call back");
}
public void serviceMethod(String parameter) {
System.out.println("service "+parameter);
doCallback();
}
}
package com.laos.javassist;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class InvocationObject implements InvocationHandler {
/**
* 目标对象
*/
private Object obj;
public InvocationObject(Object target){
this.obj = target;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//目标对象的方法,也即是目标对象实现接口的方法
return method.invoke(obj, args);
}
}
package com.laos.javassist;
import java.lang.reflect.Proxy;
/**
* 动态代理
* @author shuzt
*
*/
public class ProxyFactoryUtils {
/**
* 生成代理对象
* @param interfaceClass
* @param targetClass
* @return
* @throws IllegalArgumentException
* @throws InstantiationException
* @throws IllegalAccessException
*/
public static Object getProxyInstance(Class[] interfaceClasses,Object targetClass)
throws IllegalArgumentException, InstantiationException,
IllegalAccessException {
//调用代理Proxy实例化一个目标对象的实例
return Proxy.newProxyInstance(interfaceClasses[0].getClassLoader(),
interfaceClasses, new InvocationObject(targetClass));
}
public static void main(String[] args){
ServiceConsumer consumer = new ServiceConsumer();
try {
Object proxy = ProxyFactoryUtils.getProxyInstance(new Class[]{Service.class,ServiceCallback.class}, consumer);
Service service = (Service)proxy;
ServiceCallback serviceBack = (ServiceCallback)proxy;
service.serviceMethod("hello");
serviceBack.doCallback();
} catch (IllegalArgumentException e) {
} catch (InstantiationException e) {
} catch (IllegalAccessException e) {
}
}
}
注意:如果ServiceConsumer 没有实现接口,调用不会出现异常!
- Java 代理,动态代理
- [Java] Java 动态代理
- java代理及动态代理
- java代理模式--动态代理
- Java静态代理、动态代理
- Java 代理之 动态代理
- Java 代理与动态代理
- java静态代理,动态代理
- 代理模式&java动态代理
- Java代理与动态代理
- Java静态代理动态代理
- JAVA代理模式--动态代理
- java 代理和动态代理
- JAVA动态代理 代理模式
- Java动态代理--jdk代理
- Java动态代理--cglib代理
- Java 代理与动态代理
- java代理模式-动态代理
- MTK MMI启动过程分析(转载)
- Myeclipse7.0 出现fatal exception occurred program will exit错误
- WMI 中 root/DEFAULT/StdRegProv 的使用例程
- window.open
- 计算机视觉的定义及其应用
- java 动态代理
- java float 类型存储到 sqlserver 的numeric 类型中,出现计算溢出的问题
- 善用backtrace解决大问题
- 变异算法之复制(transform)
- 指针类型的幻觉
- sql中rtrim的用法
- Android 使用AsyncTask后台线程实现数据异步刷新
- 关于常见排序算法的复杂度及稳定性分析和结论
- 用Microsoft Internet Transfer Control 实现 FTP