通过上面的两篇文章想必大家应该理解类的类类型的相关知识。本文主要介绍的是通过类的类类型分别获取类的方法信息,成员变量信息和构造函数信息的一些方法。
一、获取类的方法信息
/**
* 打印类及类的方法信息
* @param obj
*/
public static void printClassMessage(Object obj){
// 获取对象的类类型
Class c = obj.getClass();
//获取类的名称
System.out.print("类的名称:" + c.getName());
//获取的类的方法
Method[] methods = c.getMethods();
// c.getDeclaredMethods();
for (int i = 0; i < methods.length; i++) {
// 得到方法名
System.out.print("类的方法名:" + methods[i].getName());
// 得到方法的返回值类型的类类型
Class returnType = methods[i].getReturnType();
System.out.print(" " + returnType.getSimpleName() + " (");
// 获取参数列表的类型的类类型
Class[] paramTypes = methods[i].getParameterTypes();
for (int j = 0; j < paramTypes.length; j++) {
System.out.print(paramTypes[j].getSimpleName());
if (j < paramTypes.length-1){
System.out.print(", ");
}
}
System.out.print(")\n");
}
}
上面有详细的注释,我就不再做过多解释。编写一个test测试一下。
public static void main(String[] args) {
String s = "hello";
ClassUtil.printClassMessage(s);
}
输出结果:
类的名称:java.lang.String
类的方法名:equals boolean (Object)
类的方法名:toString String ()
类的方法名:hashCode int ()
类的方法名:compareTo int (String)
类的方法名:compareTo int (Object)
类的方法名:indexOf int (String, int)
类的方法名:indexOf int (String)
类的方法名:indexOf int (int, int)
类的方法名:indexOf int (int)
类的方法名:valueOf String (int)
类的方法名:valueOf String (long)
类的方法名:valueOf String (float)
类的方法名:valueOf String (boolean)
类的方法名:valueOf String (char[])
类的方法名:valueOf String (char[], int, int)
类的方法名:valueOf String (Object)
类的方法名:valueOf String (char)
类的方法名:valueOf String (double)
类的方法名:charAt char (int)
二、获取类的成员变量信息
/**
* 打印的成员变量的信息
*
* @param obj
*/
public static void printClassFieldMessage(Object obj) {
// 获取对象的类类型
Class c = obj.getClass();
/*
* 成员变量也是对象
* java.lang.reflect.Field
* Field类封装了关于成员变量的操作
* getFields()方法获取的是所有的public的成员变量的信息
* getDeclaredFields获取的是该类自己声明的成员变量的信息
*/
Field[] fields = c.getDeclaredFields();
for (Field field : fields) {
//得到成员变量的类型的类类型
Class FiledType = field.getType();
String typeName = FiledType.getName();
//得到成员变量的名称
String fieldName = field.getName();
System.out.println(typeName + " " + fieldName);
}
}
编写一个test测试一下。
public static void main(String[] args) {
String s = "hello";
ClassUtil.printClassFieldMessage(s);
}
输出结果:
[C value
int hash
long serialVersionUID
[Ljava.io.ObjectStreamField; serialPersistentFields
java.util.Comparator CASE_INSENSITIVE_ORDER
三、获取类的构造函数信息
/**
* 打印对象的构造函数的信息
*
* @param obj
*/
public static void printConstructMessage(Object obj) {
// 获取对象的类类型
Class c = obj.getClass();
/*
* 构造函数也是对象
* java.lang. Constructor中封装了构造函数的信息
* getConstructors获取所有的public的构造函数
* getDeclaredConstructors得到所有的构造函数
*/
//Constructor[] cs = c.getConstructors();
Constructor[] cs = c.getDeclaredConstructors();
for (Constructor constructor : cs) {
System.out.print(constructor.getName() + "(");
//获取构造函数的参数列表--->得到的是参数列表的类类型
Class[] paramTypes = constructor.getParameterTypes();
for (Class class1 : paramTypes) {
System.out.print(class1.getName() + ", ");
}
System.out.println(")");
}
}
编写一个test测试一下。
public static void main(String[] args) {
String s = "hello";
ClassUtil.printConstructMessage(s);
}
输出结果:
java.lang.String([B, int, int, )
java.lang.String([B, java.nio.charset.Charset, )
java.lang.String([B, java.lang.String, )
java.lang.String([B, int, int, java.nio.charset.Charset, )
java.lang.String([B, int, int, java.lang.String, )
java.lang.String([C, boolean, )
java.lang.String(java.lang.StringBuilder, )
java.lang.String(java.lang.StringBuffer, )
java.lang.String([B, )
java.lang.String([I, int, int, )
java.lang.String()
java.lang.String([C, )
java.lang.String(java.lang.String, )
java.lang.String([C, int, int, )
java.lang.String([B, int, )
java.lang.String([B, int, int, int, )