
Java代理
发布日期:2021-05-07 20:58:02
浏览次数:13
分类:技术文章
本文共 2253 字,大约阅读时间需要 7 分钟。
代理
概述
利用代理可以在运行时创建一个实现了一组给定接口的新类: 这种功能只有在编译时无法确定需要实现哪个接口时才有必要使用。
如何使用代理
Proxy 提供用于创建动态代理类和实例的静态方法,它也是由这些方法创建的所有动态代理类的超类。要为某个接口创建代理Foo:
InvocationHandler handler = new MyInvocationHandler(...); Class proxyClass = Proxy.getProxyClass(Foo.class.getClassLoader(), Foo.class); Foo f = (Foo) proxyClass.getConstructor(InvocationHandler.class).newInstance(handler);
或
Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(), new Class [] { Foo.class }, handler);
一个简单示列
import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class TraceHandler implements InvocationHandler { private Object target ; public TraceHandler (Object t) { target = t; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println(method.getName()); // print implicit argument System.out.print(target+"") ; // print method name System.out.print("."+ method.getName() + "("); // print explicit arguments if (args != null) { for (int i = 0; i < args.length; i++) { System.out.print(args[i]); if (i < args.length - 1) System.out.print(", "); } } System.out.println(") "); // invoke actual method return method.invoke(target, args); // 调用target对象的方法(与method.getName()返回值对应的方法) }}
public class ProxyTest { public static void main(String[] args) { Object[] elements = new Object[1000]; for (int i = 0; i < elements.length; i ++) { Integer value = i + 1; InvocationHandler handler = new TraceHandler(value) ; Object proxy = Proxy.newProxyInstance(null, new Class[]{ Comparable.class}, handler); elements[i] = proxy; } // construct a random integer Integer key = new Random().nextInt(elements.length) + 1; // search for the key int result = Arrays.binarySearch(elements, key) ; // print match if found if (result >= 0) System.out.println(elements[result]); }}
每个代理类调用方法时都会调用InvocationHandler.invoke方法。
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2025年03月26日 00时56分04秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
统计字符数
2019-03-04
Vue Element UI Upload 上传多张图片
2019-03-04
JS数据类型的判断
2019-03-04
实现一个简易Vue(三)Compiler
2019-03-04
仿小米商城(上)
2019-03-04
仿小米商城(下)
2019-03-04
【30】kotlin 闭包
2019-03-04
文件md5怎么会变化
2019-03-04
好玩的editText
2019-03-04
自动安装服务2
2019-03-04
android 用action拦截打电话界面
2019-03-04
错误: 编码GBK的不可映射字符
2019-03-04
Python-Url编码和解码
2019-03-04
2019年一个程序员的回顾与成长计划
2019-03-04
vue if else用法。
2019-03-04
vue 官方实例教程 markdown demo
2019-03-04