运用动态代理和反射机制实现简单的AOP操作
首先写一个动态代理类
ProxyFactoryBean.java
package Aopframework;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Collection;
import ProxyDemo.Advice;
import ProxyDemo.AdviceImpl;
public class ProxyFactoryBean {
private AdviceImpl adviceImpl;
private Object target;
public AdviceImpl getAdviceImpl() {
return adviceImpl;
}
public void setAdviceImpl(AdviceImpl adviceImpl) {
this.adviceImpl = adviceImpl;
}
public Object getTarget() {
return target;
}
public void setTarget(Object target) {
this.target = target;
}
public Object getProxy() {
Collection Proxyt = (Collection)Proxy.newProxyInstance(
Collection.class.getClassLoader(),
/* new Class[]{Collection.class},*/
target.getClass().getInterfaces(),
new InvocationHandler(){
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
adviceImpl.beforeMethod();
Object retVal= method.invoke(target, args);
adviceImpl.afterMethod(method);
return retVal;
}
}
);
return Proxyt;
}
}
BeanFactory.java
package Aopframework;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import ProxyDemo.AdviceImpl;
public class BeanFactory {
Properties props = new Properties();
public BeanFactory(InputStream ips){
try {
props.load(ips);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public Object getBean(String name){
String className=props.getProperty(name);
Object bean = null;
try {
Class clazz= Class.forName(className);
bean=clazz.newInstance();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(bean instanceof ProxyFactoryBean){
Object proxy=null;
ProxyFactoryBean proxyFactoryBean=(ProxyFactoryBean)bean;
try {
AdviceImpl adviceImpl = (AdviceImpl)Class.forName(props.getProperty(name+".advice")).newInstance();
Object target = Class.forName(props.getProperty(name+".target")).newInstance();
proxyFactoryBean.setAdviceImpl(adviceImpl);
proxyFactoryBean.setTarget(target);
proxy=proxyFactoryBean.getProxy();
} catch (Exception e) {
e.printStackTrace();
}
return proxy;
}
return bean;
}
}
AopFrameworkTest.java
package Aopframework;
import java.io.InputStream;
public class AopFrameworkTest {
public static void main(String[] args) {
InputStream ips =AopFrameworkTest.class.getResourceAsStream("config.properties");
Object bean=new BeanFactory(ips).getBean("xxx");
System.out.println(bean.getClass().getName());
}
}
config.properties
#xxx=java.util.ArrayList
xxx=Aopframework.ProxyFactoryBean
xxx.advice=ProxyDemo.AdviceImpl
xxx.target=java.util.ArrayList