`
chinrui
  • 浏览: 94073 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

使用JDK中的InvocationHandler、Proxy实现动态代理

阅读更多
动态代理(Dynamic Proxy)

一、切面编程(在方法前后加上一些逻辑,如下:在save(User user)方法前后加逻辑)
准备工作:
public class UserDAOImpl {
	public void save(User user) {
		System.out.println("user saved!");
	}
}

1、实现方法一:直接在方法里面逻辑前后进行添加
public class UserDAOImpl implements UserDAO {
	public void save(User user) {
		System.out.println("user start");   //在方法前添加逻辑
		System.out.println("user saved!");
	}
}

2、实现方法二:使用继承进行添加
public class UserDAOImpl2 extends UserDAOImpl {
	@Override
	public void save(User user) {
		System.out.println("user start");   //在方法前添加逻辑
		super.save(user);
	}
}

3、实现方法三:使用接口进行添加
添加接口UserDAO
public interface UserDAO {
	public void save(User user);
}

让UserDAOImpl继承接口
public class UserDAOImpl implements UserDAO {
	public void save(User user) {
		System.out.println("user saved!");
	}
}

让UserDAOImpl2继承接口
public class UserDAOImpl2 implements UserDAO {
	
	private UserDAOImpl userDAOImpl = new UserDAOImpl();
	
	public void save(User user) {
		System.out.println("user start");   //在方法前添加逻辑
		userDAOImpl.save(user);
	}
}

小总结:三种方法中,使用接口和组合最为合适,但是如果要添加逻辑的方法十分多,而且因继承接口而形成的结构十分复杂的时候,可以使用动态代理来帮助实现。
二、使用动态代理添加逻辑
将所需要添加的逻辑封装成一个类,让其继承InvocationHandler接口
public class LogInterceptor implements InvocationHandler {

	private Object target;  //需要添加逻辑的对象
	
	public LogInterceptor(Object target) {
		this.target = target;
	}
	
	public void log(Method m) {
		System.out.println(m.getName() + " start");
	}

	/*
	 * proxy 代理对象
	 * method 代理对象要执行的方法
	 * args 所需执行方法的参数
	 */
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		log(method);    //在执行方法前添加逻辑
		method.invoke(target , args);
		return null;
	}

}

使用Proxy获得代理对象,代理对象与被代理对象要实现同样的接口
public class TestProxy {
	/*
	 * userDAO 要代理的对象,实现了UserDAO接口
	 * li 给代理添加逻辑的类
	 * proxy 通过Proxy的静态方法生成的代理对象
	 * 代理对象与被代理的对象的ClassLoader要一样
	 * 通过传入的参数,实现与代理对象同样的接口
	 */
	public void testProxy() {
		UserDAO userDAO = new UserDAOImpl();
		LogInterceptor li = new LogInterceptor(userDAO);  
		UserDAO proxy = (UserDAO)Proxy.newProxyInstance(
				userDAO.getClass().getClassLoader(), new Class[]{UserDAO.class}, li);
		proxy.save(new User());
		proxy.delete();
	}
}

分享到:
评论

相关推荐

    JDK动态代理+JDK动态代理完整代码+JDK动态代理代码实现逻辑

    动态代理::在程序运行时,运用反射机制动态创建而成。 动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员...java.lang.reflect 包中的Proxy类和InvocationHandler接口提供了生成动态代理类的能力。

    AOP的实现机制

    使用动态代理实现AOP需要有四个角色:被代理的类,被代理类的接口,织入器,和InvocationHandler,而织入器使用接口反射机制生成一个代理类,然后在这个代理类中织入代码。被代理的类是AOP里所说的目标,...

    JDK的动态代理(powernode 文档)(源代码)

    JDK的动态代理(powernode 文档)(源代码) JDK的动态代理(powernode 文档) 一、动态代理 1.1JDK动态代理 1.1.1 proxy 1.1.2 InvocationHandler 1.1.3 创建一个Maven项目 1.1.4 导入Spring的相关依赖 1.1.5 修改...

    Java面向对象系列[v1.0.0][使用反射生成动态代理]

    在Java的java.lang.reflect包里有个Proxy类和一个InvocationHandler接口,通过使用他们可以生成JDK动态代理类或动态代理对象 使用Proxy和InvocationHandler创建动态代理 Proxy提供了用于创建动态代理类和代理对象的...

    JDK动态代理(powernode CD2207 video)(教学视频+源代码)

    JDK动态代理(powernode CD2207 video)(教学视频+源代码) JDK动态代理(powernode CD2207 video) 一、动态代理 1.1JDK动态代理 1.1.1 proxy 1.1.2 InvocationHandler 1.1.3 创建一个Maven项目 1.1.4 导入Spring...

    类似spring Aop的Proxy封装

    有一天在用回调模版的时候,忽然间又想到jdk自带的Proxy类似乎不是怎么好用,为何不把其做成回调模版呢,可以将其改造称类似spring Aop ...省去了去实现jdk的InvocationHandler,而且用户只关心对方法进行怎样的处理.

    spring动态代理原理

    通过代码了解springaop原理,代码采用jdk的动态代理相关类Proxy、InvocationHandler解释动态代理模式

    demo:java生产项目常用的demo

    使用jdk proxy代理接口方式实现 使用Cglib代理类方式实现 自己实现的动态代理 模仿jdk proxy自己实现动态代理: 核心:实现动态代理的Proxy类 , 实现动态代理的InvocationHandler类重写invoke方法实现. 二.spring 1...

    java 实现AOP

     JDK1.2以后提供了动态代理的支持,程序员通过实现java.lang.reflect.InvocationHandler接口提供一个执行处理器,然后通过java.lang.reflect.Proxy得到一个代理对象,通过这个代理对象来执行商业方法,在商业方法被...

    疯狂JAVA讲义

    学生提问:使用组合关系来实现复用时,需要创建两个Animal对象,是不是意味着使用组合关系时系统开销更大? 159 5.9 初始化块 159 5.9.1 使用初始化块 160 5.9.2 初始化块和构造器 161 5.9.3 静态初始化块 162 ...

    摩西设计

    JDKProxy,JDKInvocationHandler,是代理类的定义和实现,这部分也就是抽象⼯⼚的另外⼀种实现⽅式。通过这样的⽅式可以很好的把放置操作Redis的⽅法进⾏代理操作,通过控制不同的⼊参对象,控制缓存的使坯。 ...

    vs没报错leetcode报错-leetcode:leetcode

    动态代理(JDK代理,借口代理) package basicKnowledge.dynamicProxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /* * JDK 动态代理 * */ ...

    Java 高级特性.doc

    这个是JDK 增加的新特性的用法! public static void loop(int x,int... args ) { //这里的参数一定要以这样的形式输入 for(int i:args) { System.out.println(i); } } 3.枚举 写枚举技巧: 1. enum Gender{...

Global site tag (gtag.js) - Google Analytics