JDK_Proxy_InvocationHandler_动态代理
本文用jdk动态代理模拟了spring的AOP的实现技术
AOP面向切面编程,可用于权限验证,效率检查,事务,异常管理等
JDK的动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。其中 InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑,在并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编织在一 起。
而Proxy为InvocationHandler实现类动态创建一个符合某一接口的代理实例
UserDAOImpl.java
public class UserDAOImpl implements UserDAO {
public void save(User user) {
System.out.println("user saved!");
}
public void delete() {
System.out.println("user deteleted");
}
}
LogInterceptor.java//处理程序必须实现InvocationHandler接口
public class LogInterceptor implements InvocationHandler {
private Object target; //被代理的对象
public Object getTarget() {
return target;
}
public void setTarget(Object target) {
this.target = target;
}
public void beforeMethod(Method m) {
System.out.println(m.getName() + " start");
}
/* proxy是代理实例,一般不会用到;method是代理实例上的方法,通过它可以发起对目标类的反射调用;
* args是通过代理类传入 的方法参数,在反射调用时使用
* */
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
beforeMethod(m);
m.invoke(target, args);
return null;
}
}
UserServiceTest.java
public void testProxy() {
UserDAO userDAO = new UserDAOImpl();
LogInterceptor li = new LogInterceptor(); //创建一个Handerler对象
li.setTarget(userDAO); //将Handler对象和被代理对象关联
/*newProxyInstance参数含义
* 第一个参数:代理的类加载器,必须和被代理的对象是一个类加载器
* 第二个参数含义:代理对象要实现的那些接口
* 第三个参数:指派方法调用的调用处理程序
* */
UserDAO userDAOProxy = (UserDAO)Proxy.newProxyInstance(userDAO.getClass().getClassLoader(), userDAO.getClass().getInterfaces(), li);
System.out.println(userDAO.getClass().getInterfaces().getClass());
System.out.println(userDAOProxy.getClass().getInterfaces()[0]);
userDAOProxy.delete();
userDAOProxy.save(new User());
}
运行结果:
interface com.bjsxt.dao.UserDAO
delete start
user deteleted
save start
user saved!
转载于:https://www.cnblogs.com/toSeeMyDream/p/5537720.html
JDK_Proxy_InvocationHandler_动态代理相关推荐
- 【spring】动态代理
代理 动态代理 特点:字节码随用随创建,随用随加载 作用:不修改源码的基础上对方法增强 分类:基于接口的动态代理.基于子类的动态代理 基于接口的动态代理: 涉及的类:Proxy 提供者:JDK ...
- (转)面试必备技能:JDK动态代理给Spring事务埋下的坑!
一.场景分析 最近做项目遇到了一个很奇怪的问题,大致的业务场景是这样的:我们首先设定两个事务,事务parent和事务child,在Controller里边同时调用这两个方法,示例代码如下: 1.场景A ...
- Java动态代理和静态代理区别
静态代理 package staticproxy;/*** 接口* @author newtouch**/ public interface IHello {public void sayHello( ...
- java动态代理【一】
java动态代理的定义:为其他目标类的方法增加切面的逻辑,即在执行目标类方法的时候,先去执行一段如校验检测的逻辑代码.java通俗一点就是生成一个继承目标类的子类,并在每个调用方法都添加一段逻辑. 应 ...
- 支撑Java框架的基础技术:泛型,反射,动态代理,cglib
以Spring为例要想看明白他的源码需要彻底理解Java的一些基础技术泛型,反射同时对于一些高级技术例如动态代理,cglib和字节码技术也需要掌握,下面就按章节来一一说清楚这些技术的核心部分,最后手写 ...
- 支撑Spring的基础技术:泛型,反射,动态代理,cglib等
1.静态代码块和非静态代码块以及构造函数 出自尚学堂视频:<JVM核心机制 类加载全过程 JVM内存分析 反射机制核心原理 常量池理解> public class Parent {stat ...
- 【spring】初识aop(面向切面编程) 使用jdk动态代理
BankServiceIImple.java 代码实现: package com.zzxtit.aop;import java.math.BigDecimal;public interface Ban ...
- java静态代理与动态代理
2019独角兽企业重金招聘Python工程师标准>>> 代理模式是java常见的设计模式.其目的是为其他对象提供一个代理以控制对某个真实对象的访问.通过代理类这一中间层,有效控制对真 ...
- Java动态代理机制
在Java的动态代理机制中,有两个重要的类.一个是InvocationHandler,另一个是Proxy. InvocationHandler:每一个动态代理类都必须要实现InvocationHand ...
- java 反射 动态代理
在上一篇文章中介绍Java注解的时候,多次提到了Java的反射API.与javax.lang.model不同的是,通过反射API可以获取程序在运行时刻的内部结构.反射API中提供的动态代理也是非常强大 ...
最新文章
- 澳大利亚悉尼科技大学招收人工智能/软件工程方向全奖博士生
- ASM3.0学习(二)
- Oracle 创建及调用存储过程,脚本示例
- c语言已知斜率 求倾角,倾斜解的问题
- 数据结构:用栈实现表达式的转换(文字描述+详细步骤示例)——中缀转后缀
- 员工离职时被HR回复“猝死了再说”!HR道歉:没控制好情绪
- ERROR:ModuleNotFoundError: No module named ‘cv2‘
- 第七章实验报告(数组实验)
- 数据库连接软件SQLyog 13.1.7 免费下载安装
- Oracle 获取汉字拼音首字母
- gauscoor软件怎么用_比对软件STAR的简单使用
- Windchill 零件操作通用类
- HTML5期末大作业:餐饮文化网站设计——餐饮文化(8页) HTML+CSS+JavaScript 学生DW网页设计美食文化
- “0X????????”指令引用的“0x00000000”内存,该内存不能为“read”或“written”
- JavaWeb 狂神
- ONF(Open Networking Foundation)
- 基于树的机器学习模型的演化
- linux下生成dump文件方法及设置
- 第三部分 数据结构 -- 第四章 图论算法-1383:刻录光盘(cdrom)
- Java 破解谷歌翻译api,可以实现程序自动化翻译文章