首先说明这里的例子是参照张孝祥老师讲解的知识而写的,再次感谢张老师!
先上个图片,文件结构图:
package proxy.aopFramework;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import proxy.Advice;
public class ProxyFactoryBean {
private Advice advice;
private Object target;
public Advice getAdvice() {
return advice;
}
public void setAdvice(Advice advice) {
this.advice = advice;
}
public Object getTarget() {
return target;
}
public void setTarget(Object target) {
this.target = target;
}
public Object getProxy(){
Object proxy= Proxy.newProxyInstance(
/* Collection.class.getClassLoader(), */
target.getClass().getClassLoader(),
/* new Class[]{Collection.class}, */
target.getClass().getInterfaces(),
new InvocationHandler(){
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
advice.beforeMethod(proxy,method); //前置通告
Object retVal=method.invoke(target, args);
advice.afterMethod(proxy,method); //后置通告
return retVal;
}
}
);
return proxy;
}
}
package proxy.aopFramework;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import proxy.Advice;
public class BeanFactory {
Properties properties=new Properties();
public BeanFactory(InputStream ips){
try {
properties.load(ips);
} catch (IOException e) {
e.printStackTrace();
}
}
public Object getBean(String name){
//拿到类名
String className=properties.getProperty(name);
Object bean=null;
try {
Class clazz=Class.forName(className);
bean=clazz.newInstance();//调用不带参数的构造方法
} catch (Exception e) {
e.printStackTrace();
}
if(bean instanceof ProxyFactoryBean ){
Object proxy=null;
try {
ProxyFactoryBean proxyFactoryBean=(ProxyFactoryBean)bean;
Advice advice =(Advice) Class.forName( properties.getProperty(name+".advice")).newInstance();
Object target=(Object) Class.forName( properties.getProperty(name+".target")).newInstance();
proxyFactoryBean.setAdvice(advice);
proxyFactoryBean.setTarget(target);
proxy=((ProxyFactoryBean)bean).getProxy();
} catch (Exception e) {
e.printStackTrace();
}
return proxy;
}
return bean;
}
}
package proxy.aopFramework;
import java.io.InputStream;
public class AopFrameworkTest {
/**
* @param args
*/
public static void main(String[] args) {
InputStream ips=AopFrameworkTest.class.getResourceAsStream("aopframeworkconfig.properties");
Object bean=new BeanFactory(ips).getBean("test");
System.out.println(bean.getClass().getName());
}
}
test=java.util.ArrayList
#test=proxy.aopFramework.ProxyFactoryBean
test.advice=proxy.MyAdvice
test.target=java.util.ArrayList