一、关于获取Class对象的三种方式:
1、 Student student = new Student();
Class studentClass1 = student.getClass();
2、 Class studentClass2 = Student.class;
3、 Class.forName(“cn.hnist.Student”);
ps:同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,无论通过哪种方式获取的Class对象都是同一个;
二、关于获取类信息的方式:
1、获取该类构造器:
(1) getDeclaredConstructors(),返回所有构造方法
(2) getConstructors(),返回所有public构造方法
(3) getConstructor(Class<?>... parameterTypes),返回指定public构造方法
例:
Constructor con0 = studentClass.getConstructor(null);
Constructor con1 = studentClass.getConstructor(boolean.class, String.class);
System.out.println(con0);
System.out.println(con1);
// 输出
//public cn.hnist.Student()
//public cn.hnist.Student(boolean, java.lang.String)
(4) getDeclaredConstructor(Class<?>... parameterTypes),返回指定构造方法
2、根据构造器创建对象:
con1.setAccessible(true);
// 假如构造器con1是private私有的,就用此方法解除私有限定
Object object = con1.newInstance(true, “张三”);
// 相当于new Student(true, “张三”);
3、获取该类成员变量:
(1) Field[] f = studentClass.getFields(),获取所有public成员变量
(2) Field[] f = studentClass.getDeclaredFields(),获取所有成员变量
(3) Field f = studentClass.getField(“name”),获取指定public成员变量
(4) Field f = studentClass.getDeclaredField(“name”),获取指定成员变量
ps:给字段设置具体的值
Class studentClass = Class.forName(“cn.hnist.Student”);
Object object = studentClass.getConstructor().newInstance();
Field field = studentClass.getField(“name”);
field.set(object, “李四”);
4、获取该类方法:
(1) Method[] methods = studentClass.getMethods(),返回所有public方法
(2) Method[] methods = studentClass.getDeclaredMethods(),返回所有方法
(3) Method method = studentClass.getMethod(“getName”, new Class[]{boolean.class, String.class}),返回指定public方法(参数:指定方法名,方法名的参数类型列表(没有参数用null表示))
(4) Method method = studentClass.getDeclaredMethod(“getName”, String.class),返回指定方法(参数:指定方法名,方法名的参数类型)
5、执行该类方法:
Object obj = studentClass.getConstructor().newInstance();
Object result= method.invoke(obj, “王五”);
// invoke参数1:要调用的对象;参数2:调用的方法要求的参数值
三、获取该方法的参数泛型和返回泛型:
//获取该类方法
Method method = Test1.class.getMethod(“test01”, Map.class, List.class);
//获取该方法的参数集合
Type[] genericParameterTypes = method.getGenericParameterTypes();
//遍历该参数集合
for (Type genericParameterType : genericParameterTypes){
System.out.println(“#”+genericParameterType);
// 判断
if (genericParameterType instanceof ParameterizedType){
Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments();
for(Type actualTypeArgument : actualTypeArguments){
System.out.println(actualTypeArgument);
}
}
}
method = Test1.class.getMethod(“test02”, null);
Type genericReturnType = method.getGenericReturnType();
if (genericReturnType instanceof ParameterizedType){
Type[] actualTypeArguments = ((ParameterizedType) genericReturnType ).getActualTypeArguments();
for(Type actualTypeArgument : actualTypeArguments){
System.out.println(actualTypeArgument);
}
}
执行结果: