------- android培训、java培训、期待与您交流!---------
一、动态代理的作用
动态代理就是运行期间根据要实现的接口或类,生成出一个子类字节码。这个动态产生的字节码就就是动态代理类,他实现或继承了父类的方法,可以由他来代替父类和拓展父类的功能。
JVM可以在运行期动态生成出类的字节码,这种动态生成的类往往被用作代理类,即动态代理类。
二、动态代理的三种实现
Class clazzProxy = Proxy.getProxyClass(Collection.class.getClassLoader(),Collection.class); //第一个参数是动态类实现接口的类加载器,第二个参数是动态类实现的接口
Constructor proxyConstr = clazzProxy.getConstructor(); //取得代理的构造函数
Collection mInstance = (Collection)proxyContr.newInstance(new MyInvocationHandler());
//通过代理实例化实现InvocationHandler接口的类
proxyConstr.newInstance(new InvocationHandler(){
public Object invoke(Object proxy,Method method,Object[] arg){
}
});
Collection proxy2 = (Collection)constructor.newInstance(new InvocationHandler(){
//用InvocationHandler的匿名子类的方式创建动态类(被代理的对象)
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
return null;
}
});
Proxy.newProxyInstance( //使用newProxyInstance(...)静态方法
Collection.calss.geClassLoader(),
new Class[]{Collection.classs), //不是最后一个参数不可以用可变参数
new InvocationHandler(){
public Object invoke(Object proxy,Method method,Object[] arg){
});
mInstance.add("dsdf"); //会调用invoke函数,参数里的method是add,args是“dsdf"
三、AOP(面向切面编程)
将要运行的代码封装到对象,然后运行对象的方法。
主类载入配置文件,把输入流给BeanFactory;
BeanFactory读出配置内容,新建Advice、Target对象传给proxyFactoryBean;
proxyFactoryBean里新建target的代理,并插入Advice类的方法。
//载入配置文件
InputStream ips = AopFrameworkTest.class.getResourceAsStream("config.properties");
Object bean = new BeanFactory(ips).getBean("xxx"); //用BeanFactory产生xxx类型的对象
//配置文件中xxx的值,通过xxx.advice中的类定义的程序点具体要做的操作
xxx=cn.itcast.day3.aopframework.ProxyFactoryBean
xxx.advice=cn.itcast.day3.MyAdvice
xxx.target=java.util.ArrayList
new InvocationHandler(){ //定义返回的动态类的InvocationHandler实例
public Object invoke(Object proxy, Method method, Object[] args){
advice.beforeMethod(method); //在执行方法之前插入advice定义的方法实现切面操作的执行
Object retVal = method.invoke(target, args); //实质执行bean的方法
------- android培训、java培训、期待与您交流!---------