Java——动态代理
来源:互联网 发布:mysql my.ini 编码 编辑:程序博客网 时间:2024/06/15 20:48
在静态代理中,我们在调用target类的时候,都是先拿到proxy类,因为proxy类中将target类作为了成员变量,并且跟target类继承了一样的接口,具有相同的方法,所以,在proxy类中,通过调用target类的方法来对目标类方法的执行前后插入特殊操作。
但是静态代理有俩缺点:1,代理类特别多,每增加一个target类,就要写一个代理;2,在proxy类中,可能我们需要插入的操作时相同的,这就造成了代码的重复。
所以,通过引入反射,可以实现动态代理,以对静态代理进行改进。
/** * @ClassName: LogHandler * @Description: 用于创建代理类 * @author 水田 * @date 2015年12月8日 上午11:17:51 */public class LogHandler implements InvocationHandler { private Object targetObject; public Object newProxyInstance(Object targetObj) {this.targetObject = targetObj;/* * 1,拿到类的classLoader * 2,得到创建的类的接口 * 3,传入回调invoke方法所在类 * */return Proxy.newProxyInstance(targetObj.getClass().getClassLoader(),targetObj.getClass().getInterfaces(), this); } /* * (非 Javadoc) <p>Title: invoke</p> <p>Description: </p> * * @param proxy * * @param 调用方法信息 * * @param args:方法的参数数组 * * @return * * @throws Throwable * * @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 {for (int i = 0; i < args.length; i++) { System.out.println(args[i]);}try { // 调用目标类的方法,返回一个object,如果方法没有返回值,则返回null method.invoke(targetObject, args);} catch (Exception e) { e.printStackTrace(); throw e;}System.out.println("start----->>>" + method.getName());return method.getName(); }}
使用示例:
/* 动态代理示例 */LogHandler logHandler = new LogHandler();UserManager userManager = (UserManager) logHandler.newProxyInstance(new UserManagerImpl());userManager.addUser("2343254", "lhc");
我们将target类中被调用方法执行前后要插入的操作放在回调函数invoke方法中,当使用代理类调用对应方法的时候,会直接进入invoke方法这里,使用method,和invoke第三个参数可以拿到被调用方法的信息。
加入了动态代理之后,明显去掉了静态代理的两个小缺点。
0 0
- java代理模式——动态代理
- Java——动态代理
- java——动态代理
- JAVA——动态代理
- Java反射—动态代理
- Java代理——静态代理和动态代理
- 代理模式(静态代理+动态代理)——JAVA
- Java动态代理二——CGLIB动态代理应用
- Java动态代理二——CGLIB动态代理应用
- Java动态代理二——CGLIB动态代理应用
- Java动态代理二——CGLIB动态代理应用
- Java动态代理二——CGLIB动态代理应用
- Java动态代理二——CGLIB动态代理应用
- Java动态代理二——CGLIB动态代理应用
- Java动态代理二——CGLIB动态代理应用
- Java动态代理学习1——静态代理
- java代理Demo——JDK动态代理
- Java动态代理学习1——静态代理
- SQL查询中having和where的异同点
- 07-图4 哈利波特的考试
- Python+Hadoop Streaming实现MapReduce(word count)
- 语音信号处理之----动态时间规整(DTW)
- linux2.6.32 platform驱动装载过程跟踪
- Java——动态代理
- springMVC ArgumentResolvers 与ReturnValueHandlers
- 纪念,IOS第一次找工作!
- Oracle两表数据相连和计算比率
- Edittext限制输入汉字50英文100
- ios属性修饰符总结
- Sed备忘录
- [LeetCode]021-Merge Two Sorted Lists
- ActionBar的使用(二)