代理的概念与应用
Class clazzProxy = Proxy.getProxyClass(Collection.class.getClassLoader,Collection.class); clazzProxy.getName(); Constructor[] Constructors = clazzProxy.getConstructors() 动态生成类的内部代码 Class Proxy{ add(Object object){ return handler.invoke(Object proxy,Method method,Object[] args); } }
Client 程序调用objProxy.add("abc")方法时
涉及三要素:objProxy对象,add方法,"abc"参数
Collection proxy2 =(Collection)Proxy.newProxyInstance( Collection.class.getClassLoader(), new Class[]{Collection.class}, new InvokeHandler(){ ArrayList target = new ArrayList(); public Object invoke(Object proxy,Method method,Object[] args){ long beginTime; Object retVal = method.invoke(target,args); return retVal; } }); proxy2.add("zxx");
方法中的内部类访问局部变量必须要加final
实现AOP功能的封装与配置
工厂类BeanFactory负责创建目标类或代理类的实例对象,
并通过配置文件实现切换。其getBean方法根据参数字符串返回一个相应的实例
对象,如果参数字符串在配置文件中对应的类名不是ProxyFactoryBean,
则直接返回该类的实例对象,否则,返回该类实例对象的getProxy方法返回的对象
BeanFactory的构造方法接收代表配置文件的输入流对象,配置文件格式如下
#xxx=java.util.ArrayList
xxx=cn.itcast.ProxyFactoryBean
xxx.target=java.util.ArrayList
xxx.advice=cn.itcast.MyAdvice
ProxyFactoryBean充当封装生成动态代理的工厂,需要为工厂创建
target和Advice