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; }
哲学管理(学)人生, 文学艺术生活, 自动(计算机学)物理(学)工作, 生物(学)化学逆境, 历史(学)测绘(学)时间, 经济(学)数学金钱(理财), 心理(学)医学情绪, 诗词美容情感, 美学建筑(学)家园, 解构建构(分析)整合学习, 智商情商(IQ、EQ)运筹(学)生存.---Geovin Du(涂聚文)