----------------------android培训、java培训、期待与您交流! ----------------------
AOP(Aspect
1.proxy类:
构造方法:
protected
方法:
static
static
static
static
2.InvocationHandler接口
3.创建动态代理类的方法
以Collection接口的动态代理类为例
A.使用Proxy.getProxyClass(ClassLoader
Collection
public
})
B.使用Proxy.newProxyInstance(ClassLoader
Collection
public
})
怎样将目标类传入代理的Invoke方法中?
把target和系统代码[即我们要在方法前或后面执行的代码]封装成对象,抽到InvocationHandler外面,之后通过参数的方法传递进去。getProxy(tarket,advice)
InvocationHandler类里面只复写了Object里面的equals,toString,hashCode方法。没有复写getClass方法,所以想要获取代理类代理的目标的类名是需要自己复写getClass方法的。
代理的运作其实还是用到了反射的原理。
C.
protected
protected
protected
D.
protected
protected
利用代理 实现一个 微型的可配置的框架;
1 配置文件通过属性名指定需要加载的类为普通类还是代理类,决定返回普通类对象或者代理对象。
这里的配置也可以通过注解来配置。
以下贴出具体代码:
package cn.itcast.enhance;
import java.io.InputStream;
import java.util.Properties;
/**
* spring beanFactory 模拟
* @author qinge
*
*/
public class BeanFactory {
private InputStream inputStream;
private String adviceClassName;
private String targetClassName;
/**
* 获取资源文件中指定属性名对应的值, 并加载该值对应的字节码
* @param inputStream
* @param targetClassName 资源文件中目标的 key
* @param adviceClassName 资源文件中Advice 类的 key
*/
public BeanFactory(InputStream inputStream,String targetClassName, String adviceClassName) {
this.inputStream = inputStream;
this.targetClassName = targetClassName;
this.adviceClassName = adviceClassName;
}
public Object getBean(String className) throws Exception{
Object bean = null;
Properties properties = new Properties();
properties.load(inputStream);
String loadClassName = properties.getProperty(className);
bean = Class.forName(loadClassName).newInstance();
if(bean instanceof ProxyFactoryBean){
ProxyFactoryBean factoryBean = (ProxyFactoryBean) bean;
Object target = Class.forName(properties.getProperty(targetClassName)).newInstance();
Advice advice = (Advice) Class.forName(properties.getProperty(adviceClassName)).newInstance();
return factoryBean.getProxy(target, advice);
}
return bean;
}
}
package cn.itcast.enhance;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyFactoryBean {
/**
* 代理的目标对象 和 要实现系统功能的对象
* @param target
* @return
*/
public Object getProxy(final Object target, final Advice advice) {
Object proxy = Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler() {
Object obj = null;
@Override
public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
advice.beforeMethod();
obj = method.invoke(target, args);
advice.afterMethod();
return obj;
}
});
return proxy;
}
}
package cn.itcast.enhance;
import java.io.InputStream;
import java.util.List;
public class BeanFactoryFrameworkTest {
public static void main(String[] args) throws Exception {
InputStream inputStream = BeanFactoryFrameworkTest.class.getResourceAsStream("spring.properties");
BeanFactory beanFactory = new BeanFactory(inputStream,"targetClassName", "adviceClassName");
List bean = (List) beanFactory.getBean("className");
bean.add("dd");
System.out.println(bean.size());
System.out.println(bean.getClass().getName());
}
}
#className=java.util.ArrayList
className=cn.itcast.enhance.ProxyFactoryBean
targetClassName=java.util.ArrayList
adviceClassName=cn.itcast.enhance.MyAdvice