Java Reflection包是Java反射技术的核心包,其中包含了若干重要的核心类,Class类就是其中之一。通过反射技术可以在运行时动态获取如下的信息:
1.构造方法信息:包括public型和所有类型
2.成员变量信息:包括public型和所有类型(已继承的和已定义的)
3.成员方法信息:包括public型和所有类型(已实现的和已定义的)
4.类信息: 包括内部类和其它对象成员
5.继承实现信息:包括继承或实现的类、接口(直接的和所有的)
Class类返回的对象一般有:Constructor,Filed,Method,Type,Class等,而Class类的某些get方法通常都需要指定参数类型,这些参数类型可以统一的通过:类名.class来获得。
通常情况下,getXxx方法拿到的都是public类型的,而getDeclaredXxxx方法拿到的是所有类型的。有些方法会一直向上追溯直到根类,如果找不到对应的信息则抛出异常。
下面简单列举一下常用的API用法:
【1】获取构造函数对象
A. getConstructor(Class... parameterTypes) :
返回Class对象所代表的类中某个指定参数类型的public构造方法
B. getConstructors()
返回Class对象所代表的类的所有public构造方法数组
C. getDeclaredConstructor(Class... parameterTypes)
返回Class对象所代表的类或接口中某个指定参数类型的构造方法(不限于public)
D. getDeclaredConstructors()
返回Class对象所代表的类中所有声明的构造方法(不限于public)
【2】获取成员变量对象
A. getField(String name)
返回Class对象所代表的类中某个public类型的成员变量
1.如果指定了名称,则返回该指定名称的成员变量
2.如果在Class中找不到该成员变量,则从Class的所有实现接口中逐个查找
3.如果在步骤1~2中都找不到该成员变量,则从Class的直接父类中查找
4.如果在步骤1~3中都找不到,则抛出一个NoSuchFieldException
B. getFields()
返回Class对象所代表的类或接口中所有public的成员变量或常量
1.该方法不单返回Class中定义的所有可访问属性,还包括继承的所有可访问属性
2.如果该Class没有任何可访问属性,则返回一个长度为0的数组
3.如果该Class代表了私有数据类型,数组,void数据类型对象,则返回一个长度为0的数组
C. getDeclaredField(String name)
返回Class对象所代表的类或接口中某个成员变量(不限于public)
D. getDeclaredFields()
返回Class对象所代表的类或接口中所有成员变量(不限于public)
【3】获取成员方法对象
A. getMethod(String name, Class... parameterTypes)
返回Class对象所代表的类中某个指定名称和参数类型的public成员方法
B. getMethods()
返回Class对象所代表的类或接口中所有的public成员方法,包括自有的和继承的
C. getDeclaredMethod(String name, Class... parameterTypes)
返回Class对象所代表的类或接口中某个指定名称和参数类型的成员方法(不限于public)
D. getDeclaredMethods()
返回Class对象所代表的类或接口中所有的成员方法,包括自有的基础的(不限于public)
【4】获取Class对象
A. getDeclaringClass()
假如Class对象所代表的类或接口,是另外一个类的成员,那么返回包含它的那个类
B. getEnclosingClass()
返回Class对象所包含的匿名内部类
C. getInterfaces()
返回Class对象所代表的类的所有实现的接口(不仅仅是直接的,还包括继承的)
D. getClasses()
返回Class对象所代表的类的所有public成员类、接口
1.该方法不单返回Class中定义的所有公共成员类、接口,还包括继承的类,接口
2.如果该Class不含有任何公共的成员类、接口,则返回一个长度为0的数组
3.如果该Class代表了私有类型数据,数组,void数据类型对象,则返回一个长度为0的数组
E. getSuperClass()
返回Class对象的直接父类
【5】获取Type对象
A. getGenericInterfaces()
返回Class对象的直接实现/继承的父接口
1.如果Class实例代表了一个类,则返回一个包含所有直接实现接口的Type数组
2.如果Class实例代表了一个接口,则返回一个包含所有直接继承接口的Type数组
3.如果Class实例代表了一个似有类型或void类型,则返回一个长度为0的Type数组
4.如果Class实例没有实现/继承任何接口,则返回一个长度为0的Type数组
B. getGenericSuperclass()
返回Class对象所代表的类直接父类
1.如果Class实例代表了Object类实例、接口、私有类型数据,void类型,则返回null
2.如果Class实例代表了数组实例,则返回Object类型
-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要尽力打好一手烂牌。
posted on 2008-09-03 14:36
Paul Lin 阅读(338)
评论(0) 编辑 收藏 所属分类:
J2SE