想要获得一个类的所有信息(比如类中存在的方法、成员变量、构造器等),首先的一步是获取该对象的类的类类型–>
Class c = obj.getClass(); //第一步
获取了对象的类的类类型之后
1、获取该类的方法
getMethods(); // 获取该类的所有方法
getDeclaredMethods(); //仅获取该类声明的方法
通过以上方法可以获取到方法列表,对于列表中的每一个方法method,可以通过
Class c2 = method.getReturnType();
来获取该方法返回值对象的类类型,通过
Class []paramTypes = method.getParameterTypes();
来获取参数列表。
2、获取该类的成员变量
getFields(); // 获取该类的所有方法
getDeclaredFields(); // 获取该类中自己声明的方法
通过以上方法可以获取方法列表,对于列表的每一个成员变量 field,可以通过
Class fieldType = field.getType();
获取变量类型
3、获取该类的构造器
getConstructor(); // 获取该类中所有构造函数
getDeclaredConstructor(); // 获取该类中自己声明的构造函数
通过以上方法可以获取构造函数列表,对于列表的每一个构造器constructor,可以通过
Class []paramTypes = method.getParameterTypes();
来获取参数列表。
tips:想要获取类的信息,最基本的操作应该是先获取的该类的类型
package com.immoc.util;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ClassUtil {
/**
* 获取类的方法信息
* @param obj 对象信息
*/
public static void getMethodsMessage(Object obj) {
Class c = obj.getClass(); // 获取obj的类的类类型
System.out.println("类的全称:" + c.getName());
/**
* 获取类的方法信息
* getMethods()方法获取类的所有方法,包括从父类继承的方法
* getDeclaredMethods()方法获取类中自己声明的方法
*/
Method []methods = c.getMethods();
//Method []methods2 = c.getDeclaredMethods();
System.out.print("方法:");
for(int i = 0; i < methods.length; i++) {
// 获得返回值类型的类类型
Class returnType = methods[i].getReturnType();
System.out.print(returnType.getSimpleName() + " ");
System.out.print(methods[i].getName() + "(");
// 获得方法的参数列表的类的类类型
Class []parameterType = methods[i].getParameterTypes();
for (Class class1 : parameterType) {
System.out.print(class1.getName() + " ");
}
System.out.println(")");
}
}
/**
* 获取成员变量的信息
* @param obj
*/
public static void getFieldsMessage(Object obj) {
// 获取obj对象的类的类类型
Class class1 = obj.getClass();
/*
* 获取该类的所有成员变量
* getField()获取所有成员变量
* getDeclaredField()获取该类自己声明的变量
*/
Field []fields = class1.getFields();
// Field []fields2 = class1.getDeclaredFields();
System.out.println("成员变量:");
for (Field field : fields) {
// 获取该成员变量的类的类类型
Class fieldType = field.getType();
System.out.print(fieldType.getSimpleName() + " ");
System.out.println(field.getName());
}
}
/**
* 获取构造函数的信息
* @param obj
*/
public static void getConMessage(Object obj) {
// 获取obj对象的类类型
Class class1 = obj.getClass();
// 构造函数也是对象,获取构造函数对象列表
//Constructor[]constructors = class1.getDeclaredConstructors();
Constructor[]constructors = class1.getConstructors();
System.out.println("构造器有:");
for (Constructor constructor : constructors) {
// 获取参数列表的类类型
Class[] paramTypes = constructor.getParameterTypes();
System.out.print(constructor.getName() + "(");
for (Class class2 : paramTypes) {
System.out.print(class2.getSimpleName() + ",");
}
System.out.println(")");
}
}
}
package com.immoc.reflect;
import com.immoc.util.ClassUtil;
/**
* 测试获取类的方法信息
*/
public class ClassDemo1 {
public static void main(String []args) {
String s = "hello";
ClassUtil.getMethodsMessage(s);
}
}
package com.immoc.reflect;
import com.immoc.util.ClassUtil;
/**
* 测试获取类的成员变量信息
*/
public class ClassDemo2 {
public static void main(String []args) {
ClassUtil.getFieldsMessage(new Integer(1));
}
}
package com.immoc.reflect;
import com.immoc.util.ClassUtil;
/**
* 测试获取类的构造器信息
*/
public class ClassDemo3 {
public static void main(String[] args) {
ClassUtil.getConMessage("Hello");
}
}