java反射机制(4)动态代理初探

动态代理是javase中重要的一环,比如说spring框架的aop基本上都是用动态代理实现的。

动态代理也能帮助程序员减少工作量,减少代码的冗余。

但是java本身的动态代理必须是实现了接口的类才能运用代理,这是一个缺点。

接口:

 

public interface HireHouse {
	public void hire();
}

接口实现类:

public class HireHouseImpl implements HireHouse {

	@Override
	public void hire() {
		System.out.println("租房");
	}

}

动态代理实现(反射):

动态代理必须实现InvocationHandler接口,然后重写invoke方法来处理其它事物。

public class DynamicProxy implements InvocationHandler {
	
	private Object obj;
	
	

	public DynamicProxy(Object obj) {
		
		this.obj = obj;
	}


	/**
	 * 动态代理
	 * 优化代码
	 * 能将功能相近的一些类的方法 集中到一个动态代理类中进行处理,减少代码冗余。
	 */

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("前置工作");
		Object invoke=method.invoke(obj, args);
		System.out.println("后置工作");
		return invoke;
	}

}

动态代理类的实现:

/**
	 * 测试: 动态代理
	 * 1.声明实体对象
	 * 2.通过动态代理的方式代理被代理者的所有方法
	 * 参数  1.获取实体的类加载器,2.获取实体类的所有接口,3.声明代理类并传入需要代理的实体类。
	 */
	@Test
	public void testDynamicProxy() throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		HireHouseImpl hhi=new HireHouseImpl();
		HireHouse hireHouse=(HireHouse) Proxy.newProxyInstance(hhi.getClass().getClassLoader(), hhi.getClass().getInterfaces(), new DynamicProxy(hhi));
		hireHouse.hire();
	}

  

 

posted on 2017-08-04 22:19  VbisoWen  阅读(134)  评论(0编辑  收藏  举报

导航