黑马程序员--反射应用和动态代理

来源:互联网 发布:iphone5susb共享网络 编辑:程序博客网 时间:2024/04/28 13:50
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

第二讲  反射应用和动态代理

一、    通过配置文件运行类中的方法

这个应用有助于我们理解反射的作用。应用场景是这样的,假设我们有三个项目分别为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提供的代理只能针对接口做代理。具体用法如下。

 

 

 

 

 

 

 

 


0 0