1、 创建实现类Collection接口的动态类和查看其名称
2、 编码列出动态类中的所有构造方法和参数名
3、 编码列出动态类所以方法和参数签名
4、 创建动态类的实例对象
>使用反射获得构造方法
>编写一个lnvocationHandler类
>调用构造方法创建动态类的实例对象,并编写lnvocationHandler类的实例对象传入
>打印创建的对象和调用对象的没有返回值的方法和getClass方法
//代理3
Collention proxy3 = (Collention) proxy.newProxyInstance(
collention.class.getClassLoader(),
new Class[] (Collention.class),
new InvocationHandler(){
ArrayList target = new ArrayList();
public Object invoke(Object proxy, Method method,Object[] args)throws Throwable
{
//ArrayList target = new ArrayList();
long beginTime = System.currentTimeMillis();
Object retVal = method.invoke(target,args);
long endTime = System.currentTimeMillis();
SOP(method.getName()+”running time”+endTime-beginTime)
return retval;
//return method.invoke(proxy,args);//死循环
}}
);
-------------------------------------
1、 工厂类BeanFactory负责创建目标类或代理类的实例对象,并通过配置文件实现切换,其getBean方法根据参数字符串返回一个相应的实例对象,如果参数字符串在配置文件中对应的类名不是ProxyFactoryBean.则直接返回该类的实例对象,否则返回该类实例对象的getProxy方法返回的对象。
2、 BeanFactory的构造方法接受代表配置文件的输入流对象,配置文件格式如下
#xxx=java.util.ArrayList
xxx= cn.itcast.ProxyFactoryBean
xxx.target=java.util.ArrayList
xxx.advice=cn.itcast.MyAdvice
3、 proxyFacotryBean充当封装生成动态代理的工厂,需要为工厂类提供配置参数信息 : 目标,通知
4、 编写客户端应用:编写实现Advice接口的类和在配置文件中进行配置,调用BeanFactory获取对象
//定义代理类封装ProxyFactoryBean.class对象
import java.lang.reflect.*;
public class ProxyFactoryBean
{
private Advice advice;
private Object target;
Object proxy3 = proxy.newProxyInstance(
target.class.getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler(){
public Object invoke(Object proxy, Method method,Object[] args)throws Throwable
{
Advice.beforeMethod(method);
Object retVal = method.invoke(target,args);
Advice afterMethod(method);
return retval;
}}
);
return proxy3;
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |