常用java代理方法
来源:互联网 发布:淘宝大学在哪里 编辑:程序博客网 时间:2024/05/29 17:06
1、jdk proxy
jdk proxy是java自带的,不需要依赖其他第三方jar包。但是它只能对接口做代理。
示例代码:
class ServiceProxy implements InvocationHandler {
/** proxy target service */
private Object target;
/**
* constructor
*
* @param target service to proxy
*/
public ServiceProxy(Object target) {
this.target = target;
}
/**
* @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(target, args);
}
}
InvocationHandler invocationHandler = new ServiceProxy(target);
ClassLoader classLoader = ServiceProxy.class.getClassLoader();
return Proxy.newProxyInstance( classLoader, target.getClass().getInterfaces(), ih );
2、CGLIB
cglib主要包含4个概念,BeanGenerator、Enhancer、MethodInterceptor、LazyLoader、Dispatcher。
1)BeanGenerator:
beangenerator主要用于动态生成一个类的子类,可以给子类动态添加一些成员变量,自动生成Getter、Setter方法。缺点是它只能生成含默认构造函数的子类。
BeanGenerator gen = BeanGenerator();
gen.setSuperclass(SuperClass.class);
gen.addProperty("name", String.class);
Class subClazz = (Class)gen.createClass();
SuperClass obj = (SuperClass)gen.create();
2)Enhancer:
enhancer用于实现某个方法调用的aop功能。enhancer生成对象会包含很多cglib自动添加进去的属性,所以最后生成的对象会比较大。
3)MethodInterceptor:
public class MethodInterceptorImpl implements MethodInterceptor{
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
return proxy.invokeSuper(obj, args);
}
}
//代理invoke方法
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(clazz);
enhancer.setCallbacks(new Callback[]{NoOp.INSTANCE, new MethodInterceptorImpl()});
enhancer.setCallbackFilter(new CallbackFilter() {
@Override
public int accept(Method method) {
//只拦截Algorithm接口定义的invoke方法
if(method.getName().equals("invoke"))
return 1;
return 0;
}
});
enhancer.setUseFactory(false);
//new 出对象
Object proxy = enhancer.create();
4)LazyLoader:
lazyLoader是cglib的代理延迟初始化接口。当接口方法被第一次调用时,才确定实际要访问的对象。
public class ConcreteClassLazyLoader implements LazyLoader{
public class PropertyBean {
private String propertyName;
public String getPropertyName() {
return propertyName;
}
public void setPropertyName(String propertyName) {
this.propertyName = propertyName;
}
}
@Override
public Object loadObject() throws Exception {
System.out.println("LazyLoader loadObject() ...");
PropertyBean bean=new PropertyBean();
bean.setPropertyName("lazy-load object propertyName!");
return bean;
}
public static void main(String[] args){
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass(PropertyBean.class);
PropertyBean propertyBean = (PropertyBean)enhancer.create(PropertyBean.class,
new ConcreteClassLazyLoader());
//此处会回调loadObject
System.out.println(propertyBean.getPropertyName());
System.out.println("after...");
//之后不再回调loadObejct,直接访问第一次返回的对象
System.out.println(propertyBean.getPropertyName());
}
}
5)Dispatcher:
Dispatcher功能与LazyLoader相同,只是dispatcher每次都会被回调。
public class ConcreteDispatcher implements Dispatcher{
public class PropertyBean {
private String propertyName;
public String getPropertyName() {
return propertyName;
}
public void setPropertyName(String propertyName) {
this.propertyName = propertyName;
}
}
@Override
public Object loadObject() throws Exception {
System.out.println("Dispatcher loadObject() ...");
PropertyBean bean=new PropertyBean();
bean.setPropertyName("Dispatcher object propertyName!");
return bean;
}
public static void main(String[] args){
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass(PropertyBean.class);
PropertyBean propertyBean = (PropertyBean)enhancer.create(PropertyBean.class,new ConcreteDispatcher());
//此处会回调loadObject
System.out.println(propertyBean.getPropertyName());
System.out.println("after...");
//每次都回调loadObejct
System.out.println(propertyBean.getPropertyName());
}
}
- 常用java代理方法
- UISearchbar 常用代理方法
- UISearchbar 常用代理方法
- tableView - 常用代理方法
- UISearchbar 常用代理方法
- IOS UIScrollView常用代理方法
- UITableView的常用代理方法
- IOS UIScrollView常用代理方法
- NSURLConnection常用的代理方法
- UITableView的常用代理方法
- UIScrollerView的常用代理方法
- UITableView的常用代理方法
- UITableView的常用代理方法
- IOS UIScrollView常用代理方法
- java代理--3种常用代理
- UIScrollView常用属性/常用代理方法总结
- JAVA常用的代理设置
- JAVA常用的代理设置
- linux 从服务器上copy文件到本地
- Java对象的序列化和反序列化
- 互联网产品经理的工作职责
- vc 实现透明窗口和不规则窗口
- Flume-ng 1.6.0+ Elasticsearch 1.7.2+ Kibana4 日志收集分析系统环境搭建及介绍
- 常用java代理方法
- iOS 文件操作(NSFileManager)结合相册选取、保存、和读取
- Linux系统的系统信息查看方式
- Linux查看系统配置常用命令
- 08 连连看
- java jdbc连接数据库的完整步骤
- 笔试
- 项目管理---Maven 修改本地存储库位置
- JS前端取得并解析后台服务器返回的JSON数据的方法