反射(动态代理)

创建测试接口

  • 创建测试接口User
public interface User {
	public void add();
	
	public void delete();
}

实现接口

  • 实现接口中的方法
public class UserImp implements User {

	@Override
	public void add() {
		System.out.println("添加功能");
	}

	@Override
	public void delete() {
		System.out.println("删除功能");
	}

}

InvocationHandler接口

  • InvocationHandler是由代理实例的调用处理程序实现的接口 。
  • 每个代理实例都有一个关联的调用处理程序。 当在代理实例上调用方法时,方法调用将被编码并分派到其调用处理程序的invoke方法。
public class MyInvocationHandler implements InvocationHandler {
	private Object target;
	
	public MyInvocationHandler(Object target) {
		this.target = target;
	}
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		System.out.println("权限校验");
		method.invoke(target, args);	//执行被代理target对象的方法
		System.out.println("日志记录");
		return null;
	}

}

测试

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		UserImp ui = new UserImp();
		ui.add();
		ui.delete();
		
		System.out.println("-------------------------------");*/
		/*
		 * public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,
		 * InvocationHandler h)
		 */
		MyInvocationHandler m = new MyInvocationHandler(ui);
		User u = (User)Proxy.newProxyInstance(ui.getClass().getClassLoader(), ui.getClass().getInterfaces(), m);
		u.add();
		u.delete();
    }
}
posted @ 2019-07-19 20:26  PoetryAndYou  阅读(155)  评论(0编辑  收藏  举报