利用反射分析类的能力-检查类的结构

    在java.lang.reflect包中有三个类Field、Method和Constructor分别用来描述类的域、方法和构造器。三者都有一个getName的方法,用来返回项目的名称。

Field类有一个getType方法,用来返回描述域所属类型的Class对象。

Method 和Constructor 类有能够报告参数类型的方法,Method类还有可以报告返回类型的方法。

      这三个类还有一个getModifiers的方法,它将返回一个整型数值,用不同的位开关描述public和static这用的修饰符使用状况。调用Modifier类的相应方法,并对返回的整型数值进行分析,还可以利用Modifier.toString方法将修饰符打印出来。

package 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;

/**
 * This program uses reflection to print all features of a class
 */
public class ReflectionTest {
    public static void main(String[] args) {
        String name;
        if(args.length > 0) {
            name = args[0];
        } else {
            Scanner in = new Scanner(System.in);
            System.out.println("Enter class name (e.g. java.util.Date):");
            name = in.next();
        }

        try {
            //print class name and superclass name (if != Object)
            Class cl = Class.forName(name);
            Class supercl = cl.getSuperclass();
            String modifiers = Modifier.toString(cl.getModifiers());
            if(modifiers.length() > 0) {
                System.out.print(modifiers + " ");
            }
            System.out.print("class " + name);
            if(supercl != null && supercl != Object.class)
                System.out.print(" extends " + supercl.getName());
            System.out.print("\n{\n");
            printConstructor(cl);
            System.out.println();
            printMethods(cl);
            System.out.println();
            printFields(cl);
            System.out.println("}");
        } catch(ClassNotFoundException e) {
            e.printStackTrace();
        }
        System.exit(0);
    }

    /**
     * Prints all constructors of a class
     */
    public static void printConstructor(Class cl) {
        Constructor[] constructors = cl.getDeclaredConstructors();
        for(Constructor c : constructors) {
            String name = c.getName();
            System.out.print("  ");
            String modifiers = Modifier.toString(c.getModifiers());
            if(modifiers.length() > 0)
                System.out.print(modifiers + " ");
            System.out.print(name + "(");

            //print parameter types
            Class[] paramTypes = c.getParameterTypes();
            for(int j = 0; j < paramTypes.length; j++) {
                if(j > 0)
                    System.out.print(", ");
                System.out.print(paramTypes[j].getName());
            }
            System.out.println(");");
        }
    }

    /**
     * Prints all methods of a class
     */
    public static void printMethods(Class cl) {
        Method[] methods = cl.getDeclaredMethods();
        for(Method m : methods) {
            Class retType = m.getReturnType();
            String name = m.getName();

            System.out.print("  ");
            //print modifiers, return type and method name
            String modifiers = Modifier.toString(m.getModifiers());
            if(modifiers.length() > 0) {
                System.out.print(modifiers + " ");
            }
            System.out.print(retType.getName() + " " + name + "(");

            //print parameter types
            Class[] paramTypes = m.getParameterTypes();
            for(int j = 0; j < paramTypes.length; j++) {
                if(j > 0)
                    System.out.print(", ");
                System.out.print(paramTypes[j].getName());
            }
            System.out.println(");");
        }
    }

    /**
     * Prints all fields of a class
     */
    public static void printFields(Class cl) {
        Field[] fields = cl.getDeclaredFields();

        for(Field f : fields) {
           Class type = f.getType();
           String name = f.getName();
           System.out.print("   ");
           String modifiers = Modifier.toString(f.getModifiers());
           if(modifiers.length() > 0) {
               System.out.print(modifiers + " ");
               System.out.println(type.getName() + " " + name + ";");
           }
        }
    }
}

编译并执行:

"C:\Program Files\Java\jdk1.8.0_131\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2018.2.1\lib\idea_rt.jar=63065:C:\Program Files\JetBrains\IntelliJ IDEA 2018.2.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_131\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\rt.jar;D:\IdeaProjects\JavaStudy\target\classes;E:\maven\repository\net\sf\json-lib\json-lib\2.4\json-lib-2.4-jdk15.jar;E:\maven\repository\commons-beanutils\commons-beanutils\1.8.0\commons-beanutils-1.8.0.jar;E:\maven\repository\commons-collections\commons-collections\3.2.1\commons-collections-3.2.1.jar;E:\maven\repository\commons-lang\commons-lang\2.5\commons-lang-2.5.jar;E:\maven\repository\commons-logging\commons-logging\1.1.1\commons-logging-1.1.1.jar;E:\maven\repository\net\sf\ezmorph\ezmorph\1.0.6\ezmorph-1.0.6.jar" reflection.ReflectionTest
Enter class name (e.g. java.util.Date):
java.util.Date
public class java.util.Date
{
  public java.util.Date(int, int, int, int, int, int);
  public java.util.Date(java.lang.String);
  public java.util.Date();
  public java.util.Date(long);
  public java.util.Date(int, int, int);
  public java.util.Date(int, int, int, int, int);

  public boolean after(java.util.Date);
  public boolean before(java.util.Date);
  public boolean equals(java.lang.Object);
  public java.lang.String toString();
  public int hashCode();
  public java.lang.Object clone();
  public int compareTo(java.util.Date);
  public volatile int compareTo(java.lang.Object);
  private void readObject(java.io.ObjectInputStream);
  private void writeObject(java.io.ObjectOutputStream);
  private final sun.util.calendar.BaseCalendar$Date normalize();
  private final sun.util.calendar.BaseCalendar$Date normalize(sun.util.calendar.BaseCalendar$Date);
  public static long parse(java.lang.String);
  public int getDate();
  public static java.util.Date from(java.time.Instant);
  public long getTime();
  public void setTime(long);
  private static final java.lang.StringBuilder convertToAbbr(java.lang.StringBuilder, java.lang.String);
  private final sun.util.calendar.BaseCalendar$Date getCalendarDate();
  private static final sun.util.calendar.BaseCalendar getCalendarSystem(long);
  private static final sun.util.calendar.BaseCalendar getCalendarSystem(int);
  private static final sun.util.calendar.BaseCalendar getCalendarSystem(sun.util.calendar.BaseCalendar$Date);
  public int getDay();
  public int getHours();
  private static final synchronized sun.util.calendar.BaseCalendar getJulianCalendar();
  static final long getMillisOf(java.util.Date);
  public int getMinutes();
  public int getMonth();
  public int getSeconds();
  private final long getTimeImpl();
  public int getTimezoneOffset();
  public int getYear();
  public void setDate(int);
  public void setHours(int);
  public void setMinutes(int);
  public void setMonth(int);
  public void setSeconds(int);
  public void setYear(int);
  public java.lang.String toGMTString();
  public java.time.Instant toInstant();
  public java.lang.String toLocaleString();
  public static long UTC(int, int, int, int, int, int);

   private static final sun.util.calendar.BaseCalendar gcal;
   private static sun.util.calendar.BaseCalendar jcal;
   private transient long fastTime;
   private transient sun.util.calendar.BaseCalendar$Date cdate;
   private static int defaultCenturyStart;
   private static final long serialVersionUID;
   private static final [Ljava.lang.String; wtb;
   private static final [I ttb;
}

进程完成,退出码 0

猜你喜欢

转载自blog.csdn.net/m0_37732829/article/details/81865103