我們可以使用Java反射來獲取關(guān)于類的信息,例如作為其包名稱,其訪問修飾符等。
要獲得簡單的類名,請使用 Class
中的 getSimpleName()
方法。
String simpleName = c.getSimpleName();
類的修飾符是關(guān)鍵字之前的關(guān)鍵字類在類聲明中,如 abstract
, public
。
Class
中的 getModifiers()
方法返回類的所有修飾符。
getModifiers()
方法返回一個整數(shù)。我們必須調(diào)用 java.lang.reflect.Modifier.toString(int modifiers)
以獲得修飾符的文本形式。
要獲取超類的名稱,請使用 Class
中的 getSuperclass()
方法。
如果對Object類調(diào)用getSuperclass()方法,它將返回null,因為它沒有超類。
要獲取類實現(xiàn)的所有接口的名稱,請使用 getInterfaces()
。
Class[] interfaces = c.getInterfaces();
import java.io.Serializable; import java.lang.reflect.Modifier; import java.lang.reflect.TypeVariable; class MyClass<T> implements Cloneable, Serializable { private int id = -1; private String name = "Unknown"; public MyClass(int id, String name) { this.id = id; this.name = name; } public Object clone() { try { return super.clone(); } catch (CloneNotSupportedException e) { throw new RuntimeException(e.getMessage()); } } public String toString() { return "MyClass: id=" + this.id + ", name=" + this.name; } } public class Main { public static void main(String[] args) { // Print the class declaration for the Class class String classDesciption = getClassDescription(MyClass.class); System.out.println(classDesciption); } public static String getClassDescription(Class c) { StringBuilder classDesc = new StringBuilder(); int modifierBits = 0; String keyword = ""; if (c.isInterface()) { modifierBits = c.getModifiers() & Modifier.interfaceModifiers(); if (c.isAnnotation()) { keyword = "@interface"; } else { keyword = "interface"; } } else if (c.isEnum()) { modifierBits = c.getModifiers() & Modifier.classModifiers(); keyword = "enum"; } modifierBits = c.getModifiers() & Modifier.classModifiers(); keyword = "class"; String modifiers = Modifier.toString(modifierBits); classDesc.append(modifiers); classDesc.append(" " + keyword); String simpleName = c.getSimpleName(); classDesc.append(" " + simpleName); String genericParms = getGenericTypeParams(c); classDesc.append(genericParms); Class superClass = c.getSuperclass(); if (superClass != null) { String superClassSimpleName = superClass.getSimpleName(); classDesc.append(" extends " + superClassSimpleName); } String interfaces = Main.getClassInterfaces(c); if (interfaces != null) { classDesc.append(" implements " + interfaces); } return classDesc.toString(); } public static String getClassInterfaces(Class c) { Class[] interfaces = c.getInterfaces(); String interfacesList = null; if (interfaces.length > 0) { String[] interfaceNames = new String[interfaces.length]; for (int i = 0; i < interfaces.length; i++) { interfaceNames[i] = interfaces[i].getSimpleName(); } interfacesList = String.join(", ", interfaceNames); } return interfacesList; } public static String getGenericTypeParams(Class c) { StringBuilder sb = new StringBuilder(); TypeVariable<?>[] typeParms = c.getTypeParameters(); if (typeParms.length > 0) { String[] paramNames = new String[typeParms.length]; for (int i = 0; i < typeParms.length; i++) { paramNames[i] = typeParms[i].getTypeName(); } sb.append("<"); String parmsList = String.join(",", paramNames); sb.append(parmsList); sb.append(">"); } return sb.toString(); } }
上面的代碼生成以下結(jié)果。
class MyClass<T> extends Object implements Cloneable, Serializable
上面的代碼生成以下結(jié)果。
更多建議: