java反射基础知识(四)反射应用实践
2017-07-24 00:26
399 查看
反射基础
p.s: 本文需要读者对反射机制的API有一定程度的了解,如果之前没有接触过的话,建议先看一下官方文档的Quick Start。在应用反射机制之前,首先我们先来看一下如何获取一个对象对应的反射类
Class,在Java中我们有三种方法可以获取一个对象的反射类。
通过getClass方法
在Java中,每一个Object都有一个
getClass()方法,通过getClass方法我们可以获取到这个对象对应的反射类:
通过forName方法
我们也可以调用Class类的静态方法
forName():
使用.class
或者我们也可以直接使用.class:
获取类型信息
在文章开头我们就提到反射的一大好处就是可以允许我们在运行期间获取对象的类型信息,下面我们通过一个例子来具体看一下。首先我们在
typeinfo.interfacea包下面新建一个接口
A:
typeinfo.packageaccess包下面新建一个接口
C,接口
C继承自接口
A,并且我们还另外创建了几个用于测试的方法,注意下面几个方法的权限都是不同的。
callHiddenMethod()方法中我们用到了几个新的API,其中
getDeclaredMethod()根据方法名用于获取Class类指代对象自己声明的某个方法,然后我们通过调用
invoke()方法就可以触发对象的相关方法:
public,
default,
protect还是
pricate方法,通过反射类我们都可以自由调用。当然这里我们只是为了显示反射的强大威力,在实际开发中这种技巧还是不提倡。
Method对象,感兴趣的读者在熟悉了反射的API之后,不妨测试一下
Filed,这里我们就不重复了。
与注解相结合
在单元测试框架比如Junit中反射机制也得到了广泛的应用,即通过注解的方式。下面我们简单地来了解一下如何通过反射机制来获取相关方法的注解信息,比如说我们有下面这样一个业务场景,当用户在修改自己密码的时候,为了保证密码的安全性,我们要求用户的新密码要满足一些条件,比如说至少要包含一个非数字字符,不能与以前的密码相同之类的条件等。
getDeclaredMethods()方法可以获取相关对象自己声明的相关方法,而
getAnnotation()则可以获取
Method对象的指定注解。
解决泛型擦除
现在有下面这样一个业务场景,我们有一个泛型集合类List<Class<? extends Pet>>,我们需要统计出这个集合类中每种具体的
Pet有多少个。由于Java的泛型擦除,注意类似
List<? extends Pet>的做法肯定是不行的,因为编译器做了静态类型检查之后,到了运行期间JVM会将集合中的对象都视为
Pet,但是并不会知道
Pet代表的究竟是
Cat还是
Dog,所以到了运行期间对象的类型信息其实全部丢失了。p.s: 关于泛型擦除:我在上一篇文章里面有详细解释,感兴趣的朋友可以看一看。
为了实现我们上面的例子,我们先来定义几个类:
Pet类继承自
Individual,
Individual类的的实现稍微复杂一点,我们实现了
Comparable接口,重新自定义了类的比较规则,如果不是很明白的话,也没有关系,我们已经将它抽象出来了,所以不理解实现原理也没有关系。
PetCreator,以后我们通过调用
arrayList()方法便可以直接获取相关
Pet类的集合。这里使用到了我们上面没有提及的
newInstance()方法,它会返回Class类所真正指代的类的实例,这是什么意思呢?比如说声明
new Dog().getClass().newInstance()和直接
new Dog()是等价的。
allTypes和
types,其中
allTypes中包含了我们呢上面所声明的所有类,但是我们具体的类型实际上只有两种即
Mutt和
EgypianMau,所以我们真正需要
new出来的宠物只是
types中所包含的类型,以后我们通过调用
getTypes()便可以得到
types中所包含的所有类型。
Pet类个数的
TypeCounter类。解释一下
isAssignalbeFrom()方法,它可以判断一个反射类是某个反射类的子类或者间接子类。而
getSuperclass()顾名思义就是得到某个反射类的父类了。
References
相关文章推荐
- java反射基础知识(五)反射应用实践
- 《Spring 3.x 企业应用开发实战》学习笔记 第三章 IoC容器概述 3.2 相关Java基础知识 类装载器 反射机制
- 《Spring 3.x 企业应用开发实战》学习笔记 第三章 IoC容器概述 3.2 相关Java基础知识 类装载器 反射机制
- 学习Spring必学的Java基础知识(1)----反射
- 学习Spring必学的Java基础知识(1)----反射
- android反射组件 (一)java 自定义annotation基础知识
- 学习Spring必学的Java基础知识(1)----反射
- Java基础---基础加强---增强for循环、自动拆装箱及享元、枚举的作用、实现带有构造方法、透彻分析反射的基础_Class类、成员变量的反射、数组参数的成员方法进行反射、数组的反射应用
- 黑马程序员 Java基础知识总结-IO流(应用总结)
- Java基础---Java---基础加强---内省的简单运用、注解的定义与反射调用、 自定义注解及其应用、泛型及泛型的高级应用、泛型集合的综合
- 编程基础知识——C++能不能支持Java和ObjC的反射?
- Java基础知识――类装载器与反射机制
- [零基础学JAVA]Java SE应用部分-36.反射机制与工厂设计模式 推荐
- Java基础知识整理三(反射机制详解…
- Java基础---基础加强---增强for循环、自动拆装箱及享元、枚举的作用、实现带有构造方法、透彻分析反射的基础_Class类、成员变量的反射、数组参数的成员方法进行反射、数组的反射应用
- Java基础知识_框架的概念以及用反射开发框架的原理
- Java WEB开发实战 之 第二部分:Web应用基础知识【私塾在线原创】
- java反射基础知识
- 黑马程序员-----java基础二十一(java之反射技术应用(代理))
- java基础——反射的应用