Java反射机制
说到反射,相信有过编程经验的人都不会陌生。反射机制让Java变得更加的灵活。反射机制在Java的众多特性中是非常重要的一个。下面就让我们一点一点了解它是怎么一回事。
什么是反射
在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
反射有什么用
1,在运行时判断任意一个对象所属的类;
2,在运行时构造任意一个类的对象;
3,在运行时判断任意一个类所具有的成员变量和方法;
4,在运行时调用任意一个对象的方法;
5,生成动态代理。
反射的API
学习一门语言,一种比较好的方式就是看它的API文档,因为它的API是最权威的,最准确的。下面我们一起看看JDK的API对于反射是如何描述的吧!
与反射有关的所有接口以及类都在java.lang.reflect包里。
接口
接口摘要 |
|
表示目前正在此 VM 中运行的程序的一个已注释元素。 |
|
GenericArrayType 表示一种数组类型,其组件类型为参数化类型或类型变量。 |
|
声明类型变量的所有实体的公共接口。 |
|
InvocationHandler 是代理实例的调用处理程序 实现的接口。 |
|
成员是一种接口,反映有关单个成员(字段或方法)或构造方法的标识信息。 |
|
ParameterizedType 表示参数化类型,如 Collection<String>。 |
|
Type 是 Java 编程语言中所有类型的公共高级接口。 |
|
TypeVariable 是各种类型变量的公共高级接口。 |
|
WildcardType 表示一个通配符类型表达式,如 ?、? extends Number 或 ? super Integer。 |
类
类摘要 |
|
AccessibleObject 类是 Field、Method 和 Constructor 对象的基类。 |
|
Array 类提供了动态创建和访问 Java 数组的方法。 |
|
Constructor 提供关于类的单个构造方法的信息以及对它的访问权限。 |
|
Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限。 |
|
Method 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息。 |
|
Modifier 类提供了 static 方法和常量,对类和成员访问修饰符进行解码。 |
|
Proxy 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。 |
|
反射操作的 Permission 类。 |
下面给大家写了一个小实例:
上面四种方法里面,我用的最多的是第四种,这种一般都是配合配置文件一起用的。反射与配置文件的结合让我们的代码变得非常的灵活,易扩展、以维护。可谓是好处多多呀,所以才有那句”反射反射,程序员的快乐!“一起尽情的快乐吧!
运行结果:
通过类本身获得对象 |
实例二:获得类的属性
运行结果:
该属性的名字为:id,该属性的类型为:java.lang.String 该属性的名字为:username,该属性的类型为:java.lang.String |
实例三:获得类实现的接口
运行结果:
该类实现的接口名字为:reflection.getinterfaces.Person |
实例四:获得类及其属性的修饰符
运行结果:
获得这个类的修饰符:public
第1个属性的修饰符为:private 第2个属性的修饰符为: 第3个属性的修饰符为:public static final |
实例五:获得类的构造函数
运行结果:
获得类reflection.getconstructor.GetConstructor所有的构造函数 遍历构造函数
这个构造函数的名字为:reflection.getconstructor.GetConstructor 通过构造函数获得这个类的名字为:class reflection.getconstructor.GetConstructor 参数 0 为 int
这个构造函数的名字为:reflection.getconstructor.GetConstructor 通过构造函数获得这个类的名字为:class reflection.getconstructor.GetConstructor 参数 0 为 int
参数 1 为 class java.lang.String |
实例六:获得父类
运行结果:
获得父类的名字为:reflection.UserInfo 成功获得UserInfoMore的父类:reflection.UserInfo |
实例七:获得类的方法
运行结果:
开始遍历类reflection.UserInfo.class 利用类的getDeclaredMethods获得类的所有方法 遍历获得的方法数组
开始遍历第1个方法 开始获取方法的变量类型 该方法的返回值类型为:class java.lang.String
开始遍历第2个方法 开始获取方法的变量类型 该方法的返回值类型为:class java.lang.Integer
开始遍历第3个方法 开始获取方法的变量类型 方法参数0类型为class java.lang.String 该方法的返回值类型为:void
开始遍历第4个方法 开始获取方法的变量类型 该方法的返回值类型为:class java.lang.String
开始遍历第5个方法 开始获取方法的变量类型 方法参数0类型为class java.lang.Integer 该方法的返回值类型为:void
开始遍历第6个方法 开始获取方法的变量类型 该方法的返回值类型为:class java.lang.String
开始遍历第7个方法 开始获取方法的变量类型 方法参数0类型为class java.lang.String 该方法的返回值类型为:void
|
这次实例不少吧,而且这些小例子都比较简单,相信大家都可以轻松秒懂。上面一些例子的代码并不是完整的,有些只有一些关键代码,如果想要完整的代码请戳下面的链接。最后祝大家学习愉快!
转自http://blog.csdn.net/liushuijinger/article/details/14223459