动态代理随笔

java中对于对象的增强有三种手段:
* 继承
  被增强的对象固定的
  增强的内容也是固定的
* 装饰者模式
  被增强的对象是可以切换的
  增强的内容是固定的
* 动态代理(AOP)
  被增强的对象可以切换:Service
  增强的内容也可以切换:事务处理

今天刚好看了下动态代理,也就写写简单的一些知识。

1.动态代理的用处

对于动态处理如果我们不想自己写个框架,那么基本上是用上不动态代理技术的,但是它可以让我们更好的理解框架内部的原理,为了学习框架打下基础。

2.运行时实现指定的接口

想实现某个接口,你需要写一个类,然后在类名字的后面给出“implements”XXX接口。这才是实现某个接口:

public interface MyInterface {
	void fun1();
	void fun2();
}
public class MyInterfaceImpl implements MyInterface {
	public void fun1() {
		System.out.println("fun1()");
	}

	public void fun2() {
		System.out.println("fun2()");
	}
}

当然,上面的代码是java中对于接口的一个简单实现,下面来看动态代理,动态代理技术可以通过一个方法调用就可以生成一个对指定接口的实现类对象。

Class[] cs = {MyInterface.class};
		MyInterface mi = (MyInterface)Proxy.newProxyInstance(loader, cs, h);

上面代码中,Proxy类的静态方法newProxyInstance()方法生成了一个对象,这个对象实现了cs数组中指定的接口。

3.newProxyInstance()的参数

Proxy类的newInstance()方法有三个参数:

·ClassLoader loader:它是类加载器类型,只要你有一个Class对象就可以获取到ClassLoader对象;

· Class[] interfaces:指定newProxyInstance()方法返回的对象要实现哪些接口,并且可以指定多个接口,例如上面例子只我们只指定了一个接口:Class[] cs = {MyInterface.class};

·InvocationHandler h:它是最重要的一个参数!它是一个接口!它的名字叫调用处理器!其实无论你调用代理对象的什么方法,它都是在调用InvocationHandler的invoke()方法。

4.InvocationHandle的invoke()方法的参数

·Object proxy:代理对象,也就是Proxy.newProxyInstance()方法返回的对象,通常我们用不上它;

· Method method:表示当前被调用方法的反射对象,例如mi.fun1(),那么method就是fun1()方法的反射对象;

· Object[] args:表示当前被调用方法的参数,当然mi.fun1()这个调用是没有参数的,所以args是一个零长数组。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值