JDK动态代理实现

          面向切面编程(AOP)思想认为软件系统主要由核心关注点(业务主体)横切关注点(附属模块)组成。可以理解为横切关注点就是对核心关注点扩展增强的部分。如在业务主体中加入日志记录、事物控制、性能统计等功能。

          往往横切关注点代码具备相同特征,且大量重复出现在业务主体中,为了减少系统重复代码,提高系统健壮性与可扩展性,可通过动态代理技术实现业务主体与附属模块的解耦分离。

/*业务逻辑接口*/

/**
 *@author xizhonghuai
 *@date 2019年3月7日
 *@readme 
 */
public interface Car {
	
	void carInfo(String name);

}


/*业务实现类*/

/**
 * @author xizhonghuai
 * @date 2019年3月7日
 * @readme
 */
public class Audi implements Car {

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.Car#CarInfo(java.lang.String, java.awt.Color)
	 */
	@Override
	public void carInfo(String name) {
		// TODO Auto-generated method stub

		System.out.println(name);

	}
}


/*动态代理类*/

/**
 * @author xizhonghuai
 * @date 2019年3月7日
 * @readme
 */
public class JDKDynamicProxy implements InvocationHandler {

	private Object obj;

	 
	public JDKDynamicProxy(Object obj) {
		super();
		this.obj = obj;
	}

	/**
	 * 获取被代理接口实例对象
	 * 
	 * @param <T>
	 * @return
	 */
	public Object getProxy() {
		return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object,
	 * java.lang.reflect.Method, java.lang.Object[])
	 */
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		// TODO Auto-generated method stub

		System.out.println("运行额外方法");

		Object result = method.invoke(obj, args);

		System.out.println("运行额外方法");

		return result;
	}

}




	/* 测试 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Car car = (Car) new JDKDynamicProxy(new Audi()).getProxy();
		
	   // Car car = new Audi();  //如果不需要额外方法直接使用业务实现类

		car.CarInfo("我是奥迪车!");
 

	}




 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值