易网时代-编程资源站
Welcome
微信登录
首页
/
操作系统
/
Linux
/
Java反射之解析目标类的成员信息
package
com.jadyer.reflection;
import
java.lang.reflect.Constructor;
import
java.lang.reflect.Field;
import
java.lang.reflect.Method;
import
java.lang.reflect.Modifier;
import
java.util.Scanner;
/**
* 解析目标类的成员信息
*/
public
class
ParseTargetClassMember {
public
static
void
main(String[] args) {
System.out.println(
"请输入类型名称:"
);
//给定的必须是完整的包层次和类名,如java.lang.String
String className =
new
Scanner(System.in).next();
//返回一个字符串的形式的含有完整包名的类名
System.out.println(
"当前类型:"
+ className);
/**
* 获取Class对象
* @see 加载以字符串形式给出的含完整包名的类名所对应的类
* @see 加载类之后,会自动创建并返回一个Class类型的对象,它所描述的就是指定类的信息
*/
Class<?> clazz =
null
;
try
{
clazz = Class.forName(className);
}
catch
(ClassNotFoundException e) {
e.printStackTrace();
}
/**
* 解析属性信息
*/
Field[] declaredFields = clazz.getDeclaredFields();
//获取clazz所关联的数据类型中声明过的所有属性和成员变量,但不包括父类中的
for
(Field field : declaredFields) {
System.out.println(
"-----------------------------------------------------------------------------------------"
);
System.out.println(
"属性:"
+ field.toString());
//输出字符串形式的属性格式,包括访问权限、数据类型、属性名、甚至初值等等
System.out.println(
" 数据类型:"
+ field.getType());
//返回当前属性的数据类型
System.out.println(
" 属性名:"
+ field.getName());
//返回当前属性的名字
// 返回当前属性的访问控制修饰符。修饰符可能有多个,如public、static、final等等
int
mod = field.getModifiers();
//实际上返回的是一个用整形数值表示的修饰符的组合。比如1代表public,17代表public加static
System.out.println(
" 属性修饰符:"
+ Modifier.toString(mod));
//将整型修饰符转换成字符串的表现形式
}
/**
* 解析方法信息
* @see 即解析当前类型中所封装的方法的信息
*/
Method[] declaredMethods = clazz.getDeclaredMethods();
//返回当前类中声明的所有的方法信息。只限于当前类的层次,不包括父类中的
for
(Method method : declaredMethods){
System.out.println(
"-----------------------------------------------------------------------------------------"
);
System.out.println(
"方法:"
+ method.toString());
//输出方法头。也就是方法的标签,方法的格式
System.out.println(
" 方法名:"
+ method.getName());
//解析方法的名字
System.out.println(
" 方法修饰符:"
+ Modifier.toString(method.getModifiers()));
//返回该方法的访问控制修饰符
System.out.println(
" 返回值类型:"
+ method.getReturnType());
//它返回的是Class对象,输出时会自动调用toString()方法
System.out.print(
" 方法参数列表:"
);
Class<?>[] parameterTypes = method.getParameterTypes();
//获取当前方法的参数列表,返回每个参数的类型,其均被封装为Class类型
for
(
int
i=
0
; i<parameterTypes.length; i++) {
Class<?> methodParameterType = parameterTypes[i];
if
(
0
!= i){
System.out.print(
", "
);
//输出每一个参数之前打印一个逗号,作为与前一个参数的类型的分隔
}
System.out.print(methodParameterType);
//Class对象的toString()方法也被重写过,它会输出当前数据类型的名字
}
System.out.println();
//输出第二个方法的信息时,换行显示
}
/**
* 解析构造方法信息
* @see 这里没有获取它的返回值。实际上Constructor类型中也不支持getReturnType()的功能
* @see 因为构造方法在声明的时候,不允许指定它的返回值
* @see 实际上它是有返回值的,即它所属的类的类型。因为构造方法运行的最后,也能够创建一个新对象,并返回其句柄
*/
Constructor<?>[] declaredConstructors = clazz.getDeclaredConstructors();
//返回当前类中声明的所有构造方法
for
(Constructor<?> constructor : declaredConstructors) {
System.out.println(
"-----------------------------------------------------------------------------------------"
);
System.out.println(
"构造方法:"
+ constructor.toString());
System.out.println(
" 方法名:"
+ constructor.getName());
System.out.println(
" 方法修饰符:"
+ Modifier.toString(constructor.getModifiers()));
System.out.print(
" 方法参数列表:"
);
Class<?>[] parameterTypes = constructor.getParameterTypes();
for
(
int
i=
0
; i<parameterTypes.length; i++) {
Class<?> constructorParameterType = parameterTypes[i];
if
(
0
!= i){
System.out.print(
", "
);
}
System.out.print(constructorParameterType);
}
System.out.println();
}
System.out.println(
"-----------------------------------------------------------------------------------------"
);
/**
* 解析当前类的父类
*/
Class<?> superClass = clazz.getSuperclass();
//它返回的也是一个Class类型的结果,对应的是当前类的父类
//实际上Class类是一个泛型类。比较规范的用法是给它一个类型参数,即类似于Class<String>的形式
System.out.println(
"当前类的父类:"
+ superClass.toString());
System.out.println(
"-----------------------------------------------------------------------------------------"
);
/**
* 解析当前类实现的接口
*/
Class<?>[] interfaces = clazz.getInterfaces();
//获取当前类所实现的所有接口,返回多个接口类型所封装成的Class数组
System.out.println(
"当前类所实现接口:"
);
for
(Class<?> clazzInterface : interfaces) {
System.out.println(clazzInterface.toString());
}
System.out.println(
"-----------------------------------------------------------------------------------------"
);
/**
* 解析当前类型所在包信息
*/
Package clazzPackage = clazz.getPackage();
//获取当前类所在的包的信息。如果没有,则返回空的双引号,即一个长度为零的字符串
System.out.println(
"当前类所在的包:"
+ clazzPackage.toString());
}
}
版权所有©石家庄振强科技有限公司2024
冀ICP备08103738号-5
网站地图