三个重要的类:
1. Constructor
提供关于类的单个构造方法的信息及对它访问权限。
2. Field
提供有关类或接口的单个字段信息及对它的访问权限,反射的字段可能是一个类(静态)字段或者是一个实例对象字段。
3. Method
提供有关类或接口的单个方法信息及如何访问该方法,所反映的方法是一个类方法或实例方法(包括抽象方法)。
利用反射分析类
需求:根据输入的类,分析该类中的所有信息,并将获得信息按照字段,构造方法,一般方法的顺序,输出到控制台
步骤:
1. 获取键盘录入
2. 根据键盘录入的类名,获取该类的对象实例
3. 根据Class类中提供的API分别获取Constructors, Fields, Methods
4. 按照Field, Contructor, Method的顺序将其输出到控制台
代码:
package com.zhangchao; 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 AnalysisClass { public static void main(String[] args) { String className; /** * 键盘录入 */ Scanner sc = new Scanner(System.in); className = sc.next(); System.out.println("------" + className); /** * 反射 */ try { Class<?> clazz = Class.forName(className); clazz.getModifiers(); String modifier = Modifier.toString(clazz.getModifiers()); if (modifier.length() > 0) { System.out.print(modifier); System.out.print(" class " + className); } Class<?> clazz_super = clazz.getSuperclass(); if (clazz_super != null && clazz_super != Object.class) { System.out.println(" extends " + clazz_super.getName() + " {"); } printConstructors(clazz); System.out.println(); printMethods(clazz); System.out.println(); printFields(clazz); System.out.println("}"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } /** * 获取并输出所有的构造方法,不包含父类 * @param cl */ public static void printConstructors(Class<?> cl) { Constructor<?>[] constructors = cl.getDeclaredConstructors(); for (Constructor<?> c : constructors) { System.out.println(" "+ c + ";"); } } /** * 获取并输出所有的一般方法 * @param cl */ public static void printMethods(Class<?> cl) { Method[] methods = cl.getDeclaredMethods(); for (Method m : methods) { System.out.println(" "+ m + ";"); } } /** * 获取并输出所有的字段 * @param cl */ public static void printFields(Class<?> cl) { Field[] fields = cl.getDeclaredFields(); for(Field f : fields) { System.out.println(" "+ f + ";"); } } }