java--代理

代理

利用代理可以在运行时创建实现了一组给定接口的新类。
只有在编译期无法确定需要实现哪个接口时才有必要使用代理。
代理类可以在运行时创建全新的类,这样的代理类能够实现你指定的接口。
代理类包含以下方法:
1.指定接口所需要的全部方法
2.Object类中的全部方法。
不能在运行时为这些方法定义新代码,实际上,需提供一个调用处理器。调用处理器是实现了InvocationHandler接口的类的对象。
// 接口只有一个方法
Object invoke(Object proxy, Method method, Object[] args);
无论何时调用代理对象的方法,调用处理器的invoke方法都会被调用,
并向其传递Method对象和原调用的参数。
- 创建代理对象
使用Proxy类的newProxyInstance方法。方法有三个参数:
1.一个类加载器
2.一个Class对象数组,每个元素对应需要实现的各个接口
3.一个调用处理器

- 示例:使用代理和调用处理器跟踪方法调用
class TraceHandle implements InvocationHandler
{
	private Object target;
	public TraceHandler(Object t)
	{
		target = t;
	}
	
	public Object invoke(Object proxy, Method m, Object[] args) 
		throws Throwable
	{
		// print method name and parameters
		// invoke actual method
		return m.invoke(target, args);
	}
}

// 构造可以跟踪方法调用的代理对象
Object value = ...;
var handler = new TraceHandler(value);
var interfaces = new Class[]{Comparable.class};
Object proxy = Proxy.newProxyInstance(
	ClassLoader.getSystemClassLoader(),
	new Class[]{Comparable.class},
	handler);
- 代理类的特性
代理类是在程序运行过程中动态创建的。
一旦被创建,它们就变成了常规类。
所有的代理类都扩展Proxy类。
一个代理类只有一个实例字段---调用处理器。
完成代理对象任务所需要的任何额外数据都必须存储在调用处理器中。
所有的代理类都要覆盖Object类的toString,equals,hashCode方法。
这些方法只是在调用处理器上调invoke。
Object类的其他方法没有重新定义。
对于一个特定的类加载器和预设的一组接口来说,只能有一个代理类。
可以用getProxyClass方法获得这个类。
Class proxyClass = Proxy.getProxyClass(null, interfaces);
代理类总是public和final。
如果代理类实现的所有接口都是public,这个代理类就不属于任何特定的包。
否则,所有非公共的接口都必须属于同一个包,同时,代理类也属于这个包。
可用Proxy类的isProxyClass检测一个特定的Class对象是否表示一个代理类。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

raindayinrain

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值