黑马程序员--反射应用和动态代理
来源:互联网 发布:iphone5susb共享网络 编辑:程序博客网 时间:2024/04/28 13:50
第二讲 反射应用和动态代理
一、 通过配置文件运行类中的方法
这个应用有助于我们理解反射的作用。应用场景是这样的,假设我们有三个项目分别为Student、Teacher、Worker,另外还有一个测试类Test用来测试这三个项目。
我们在学习反射之前的做法是这样的,这种编码称为“硬编码”,即把代码写死了。
这样的做法太麻烦,测试代码需要不断的修改。有了反射之后,就能很好的解决这个问题,一般需要和配置文件配合使用。在这里我们用class.txt来代替配置文件,配置文件一般由键值对组成,并且你需要知道有两个键className和methodName22
反射的解决方案如下。
二、 通过反射绕过泛型检查
在学习反射之前,想给指定泛型的集合添加其他类型的数据是做不到的。比如有个集合是ArrayList<Integer> array=new ArrayList<Integer>( ),想实现array.add(“hello”)是无法实现的。但是学习了反射以后,这个功能就可以实现了。通过查看add的源码我们发现,泛型默认的类型是Object,只不过在JDK5以后为了数据的安全加入了泛型机制,但是这个机制仅仅是给编译期看的,真正运行时依然是Object。通过反编译工具查看代码也可以发现,在反编译器中,泛型被去掉了,由此可见泛型检查在运行期是不存在的。
所以如果我们能拿到集合的源码就可以实现如题的功能了。而反射恰好就可以拿到类的源码。反射的解决方案如下。
三、 写一个给类中私有成员变量赋值
public void setProperty(Object obj, String propertyName value )
这个方法声明的意思是给obj中的成员变量propertyName赋值为value。这里主要指给私有成员变量赋值,因为除此之外的成员变量可以通过创建对象对其赋值。
四、 动态代理
动态代理的应用场景是这样的,假设有一个借口UserDao,他有四个抽象方法add,delete,update,find。另外有一个UserDaoDemo类实现这个借口,实现代码如下
但是真实的应用场景往往不是这样的。写代码要符合他的开闭原则,即对扩展开放,对修改关闭。真实的应用场景是在任何操作前都要检查用户权限,在操作后要生成操作日志。所以以上代码改进为如下代码。
但是假如还有别的类也要实现这样的功能,那么也要在具体实现类中分别加上检查用户权限和生成操作日志,很显然这样的代码不够灵活,这样的实现不好。那么我们可不可以找一个“中介”来给我们实现添加检查用户权限和生成操作日志功能呢。这个“中介”即为动态代理
在Java中java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过使用这个类和接口就可以生成动态代理对象。JDK提供的代理只能针对接口做代理。具体用法如下。
- 黑马程序员--反射应用和动态代理
- 黑马程序员——反射高级应用之动态代理
- 黑马程序员_Java反射-简单动态代理
- 黑马程序员-反射机制_动态代理
- 黑马程序员——反射——类的加载,反射的应用,简单动态代理
- 黑马程序员--静态代理和动态代理
- 黑马程序员--静态代理和动态代理
- 黑马程序员--反射的一个应用:动态代理(记住第三种方式,重要)
- 黑马程序员反射和代理模式
- 黑马程序员-Java反射机制及JDK动态代理技术
- 黑马程序员java学习笔记,反射及动态代理
- 黑马程序员之----------java 之反射与动态代理模式
- 黑马程序员------------反射、内省、类加载、动态代理
- 黑马程序员——Java反射&动态代理
- 黑马程序员 动态代理
- 黑马程序员-动态代理
- 黑马程序员 动态代理
- 黑马程序员-动态代理
- 欢迎使用CSDN-markdown编辑器
- Hadoop编码解码【压缩解压缩】机制详解(1)
- Android BlueTooth开发
- C语言 第一章
- 求最大子矩阵的大小 + 栈
- 黑马程序员--反射应用和动态代理
- 结构体的内存存储细节
- [Pythong标准库]array——固定类型数据序列
- 实战c++中的vector系列--使用sort算法对vector进行排序(对vector<string>排序、使用稳定的排序std::stable_sort())
- JNDI与JDBC比较以及连接池的技术
- many-to-one各属性含义
- day2
- 【ShawnZhang】带你看数据结构——第十五课:哈夫曼树
- opencv的类型和方法在不同语言中的对应关系