Java: Reflection in jdk 17

 

/**
 * 版权所有 2022 涂聚文有限公司
 * 许可信息查看:
 * 描述:
 *
 * 历史版本: JDK 17.01
 * 2022-09-12 创建者 geovindu
 * 2022-09-12 添加 Lambda
 * 2022-09-12 修改:date
 * 接口类
 * 2022-09-12 修改者:Geovin Du
 * 生成API帮助文档的指令:
 *javadoc - -encoding Utf-8 -d apidoc DuReflection.java
 * Interface
 * Record
 * Annotation
 * Enum
 * */


package CoreJava.twelfth;

import java.util.*;
import java.lang.reflect.*;
/**
 *
 * @version 1.0
 * @author geovindu
 * */
public  class DuReflection {

    /**
     * Prints all constructors of a class
     * @param cl a class
     */
    public static void printConstructors(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
     * @param cl 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
     * @param cl 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 + ";");
        }
    }

    /**
     * Prints all permitted subtypes of a sealed class
     * @param cl a class
     */
    public static void printPermittedSubclasses(Class cl)
    {
        if (cl.isSealed())
        {
            Class<?>[] permittedSubclasses = cl.getPermittedSubclasses();
            for (int i = 0; i < permittedSubclasses.length; i++)
            {
                if (i == 0)
                    System.out.print(" permits ");
                else
                    System.out.print(", ");
                System.out.print(permittedSubclasses[i].getName());
            }
        }
    }

    /**
     * Prints all directly implemented interfaces of a class
     * @param cl a class
     */
    public static void printInterfaces(Class cl)
    {
        Class<?>[] interfaces = cl.getInterfaces();
        for (int i = 0; i < interfaces.length; i++)
        {
            if (i == 0)
                System.out.print(cl.isInterface() ? " extends " : " implements ");
            else
                System.out.print(", ");
            System.out.print(interfaces[i].getName());
        }
    }

}

  

调用:

public static void main(String[] args) throws ReflectiveOperationException {



        try
        {



            String name;
            if (args.length > 0) name = args[0];
            else
            {
                var in = new Scanner(System.in);
                System.out.println("Enter class name (e.g. java.util.Date): ");
                name = in.next();
            }

            // print class modifiers, name, and superclass name (if != Object)
            Class cl = Class.forName(name);
            String modifiers = Modifier.toString(cl.getModifiers());
            if (modifiers.length() > 0) System.out.print(modifiers + " ");
            if (cl.isSealed())
                System.out.print("sealed ");
            if (cl.isEnum())
                System.out.print("enum " + name);
            else if (cl.isRecord())
                System.out.print("record " + name);
            else if (cl.isInterface())
                System.out.print("interface " + name);
            else
                System.out.print("class " + name);
            Class supercl = cl.getSuperclass();
            if (supercl != null && supercl != Object.class) System.out.print(" extends "
                    + supercl.getName());

            DuReflection.printInterfaces(cl);
            DuReflection.printPermittedSubclasses(cl);

            System.out.print("\n{\n");
            DuReflection.printConstructors(cl);
            System.out.println();
            DuReflection.printMethods(cl);
            System.out.println();
            DuReflection.printFields(cl);
            System.out.println("}");
}

  

输出:

Enter class name (e.g. java.util.Date): 
java.util.Date
public class java.util.Date implements java.io.Serializable, java.lang.Cloneable, java.lang.Comparable
{
   public java.util.Date(java.lang.String);
   public java.util.Date(int, int, int, int, int, int);
   public java.util.Date(int, int, int, int, int);
   public java.util.Date();
   public java.util.Date(long);
   public java.util.Date(int, int, int);

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

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

  

 

posted @ 2022-10-31 23:23  ®Geovin Du Dream Park™  阅读(72)  评论(0)    收藏  举报