java技术之动态代理以及AOP编程

写技术博客挺累的啊....总结了一下午总算是出来了~废话不多说,贴代码吧~


名词解释:

动态代理:既指类的代理对象是动态生成的,而不是有程序员预先编写好的,这里利用java反射包中的类Proxy,核心代码如下:

通过
                     Proxy.getProxyClass(ClassLoader loader, Class<?>... interfaces)
如:
                     Object target;
                     Class clazz = Proxy.getClass(
                          target.getClass().getClassLoader(),
                          target.getClass().getInterfaces()
                     );

                     Object proxyObj = clazz.newInstance();

或者直接通过:
                     Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)

例如:
                     Proxy.newProxyInstance(
				target.getClass().getClassLoader(), 
				target.getClass().getInterfaces(), 
				new MyInvocationHandler());


模拟AOP和动态代理代码片段:

 
 
package com.java.enhance;

import java.io.InputStream;
import java.util.List;

/**
 * 测试AOP以及动态代理
 * 
 * @author zhuoni
 *
 */

public class DynamicProxyDemo {
	public static void main(String[] args) throws Exception {
		//1.读取资源文件
		InputStream inputStream = DynamicProxyDemo.class.getResourceAsStream("bean.properties");
		//2.创建beanFactory实例
		BeanFactory beanFactory = new BeanFactory(inputStream);
		
		List bean = (List)beanFactory.getBean("bean");
		bean.add("aa");
	}
}

运行结果:
在目标类方法执行之前要做的内容~
执行目标方法~
在目标类方法执行之后要做的内容~

结论:
    当我们获取代理类的时候,就会生成对应的代理对象返回

相关类以及接口代码:
package com.java.enhance;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;


/**
 * Bean工厂类
 * 
 * @author zhuoni
 *
 */
public class BeanFactory {
	private Properties prop = new Properties();
	public BeanFactory(InputStream inStream){
		try {
			prop.load(inStream);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public  Object getBean(String name) throws Exception{
		String className = prop.getProperty(name);
		Class  beanClass = Class.forName(className);
		Object obj = beanClass.newInstance();//这就是为什么javabean需要一个默认的无参构造函数的原因:方便利用反射实例化
		//如果获取的是代理类,则获取其目标类以及切面类,创建其代理类返回
		if(obj instanceof ProxyFactoryBean){
			ProxyFactoryBean proxyBean = (ProxyFactoryBean)obj;
			Object target = Class.forName(prop.getProperty(name+".target")).newInstance();
			Advise advise = (Advise)Class.forName(prop.getProperty(name+".advise")).newInstance();
			proxyBean.setTarget(target);
			proxyBean.setAdvise(advise);
			obj = proxyBean.getProxy();
		}
		return obj;
	}
}
---------------------------------------------------------------------------------------------






package com.java.enhance;

import java.lang.reflect.Proxy;

/**
 * 动态生成代理类的工厂类
 * 
 * @author zhuoni
 *
 */
public class ProxyFactoryBean {
	/*被代理的类,也称为目标类*/
	private  Object  target;
	/*封装目标类方法执行之外所要做的操作的类*/
	private  Advise advise;
	
	/**
	 * 获取目标类的代理类
	 * 
	 * @return
	 */
	public Object getProxy() {
		Object proxy = Proxy.newProxyInstance(
				target.getClass().getClassLoader(), 
				target.getClass().getInterfaces(), 
				new MyInvocationHandler(target,advise));
		return proxy;
	}
	public Object getTarget() {
		return target;
	}
	public void setTarget(Object target) {
		this.target = target;
	}
	public Advise getAdvise() {
		return advise;
	}
	public void setAdvise(Advise advise) {
		this.advise = advise;
	}
	
	
}







package com.java.enhance;

/**
 * 封装代理类所要做的内容的接口
 * 
 * 
 * @author zhuoni
 *
 */
public interface Advise {
	public void beforeMethod();
	
	public void afterMethod();
}






package com.java.enhance;

public class MyAdvise implements Advise {

	public void beforeMethod() {
		System.out.println("在目标类方法执行之前要做的内容~");
	}

	public void afterMethod() {
		System.out.println("在目标类方法执行之后要做的内容~");

	}

}
package com.java.enhance;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
	 * 我的InvocationHandler
	 * 
	 * @author zhuoni
	 *
	 */
	class MyInvocationHandler implements InvocationHandler{
		/*被代理的类,也称为目标类*/
		private static Object  target;
		/*封装目标类方法执行之外所要做的操作的类*/
		private static Advise advise;
		
		public MyInvocationHandler(Object target, Advise advise) {
			this.target = target;
			this.advise = advise;
		}
		public Object invoke(Object proxy, Method method, Object[] args)
				throws Throwable {
			advise.beforeMethod();
			System.out.println("执行目标方法~");
			Object value = method.invoke(target, args);
			advise.afterMethod();
			return value;
		}
		public Object getTarget() {
			return target;
		}
		public void setTarget(Object target) {
			this.target = target;
		}
		public Advise getAdvise() {
			return advise;
		}
		public void setAdvise(Advise advise) {
			this.advise = advise;
		}		
	}
	
资源文件:bean.properties:
    #bean=java.util.ArrayList
    bean=com.java.enhance.ProxyFactoryBean
    bean.advise=com.java.enhance.MyAdvise
    bean.target=java.util.ArrayList








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值