package huang.de.wei; import java.lang.annotation.Annotation; import java.lang.reflect.Constructor; import java.lang.reflect.Method; @SuppressWarnings(value="unchecked") @Deprecated public class ClassTest { //為這個類定義私有構造器 private ClassTest(){ } //定義一個有參數的構造器 public ClassTest(String name){ System.out.println("這是私有的構造器"); } //定義一個無參數的info方法 public void info(){ System.out.println("這是一個無參數的info方法"); } public void info(String str){ System.out.println("這是有參數的info方法,參數為:"+str); } //定義一個內部測試類 class Inner{ } public static void main(String[] args) throws SecurityException, NoSuchMethodException, ClassNotFoundException{ //下面的代碼可以獲取ClassTest對飲的Class Class<ClassTest> clazz=ClassTest.class; //獲取該Class對象對應的全部構造器 Constructor[] ctors=clazz.getDeclaredConstructors(); System.out.println("類的構造器全部如下"); for(Constructor c : ctors){ System.out.println(c); } //獲取class對象所對應的全部public構造器 System.out.println("class對象所對應的全部public構造器:"); Constructor[] publicCtors=clazz.getConstructors(); for(Constructor c :publicCtors){ System.out.println(c); } //獲取calss對象所對應全部的public方法 Method[] mtds=clazz.getMethods(); System.out.println("ClassTest的全部public方法如下:"); for(Method c : mtds){ System.out.println(c); } //獲取Class對象所對應類的指定方法 System.out.println("ClassTest里面帶一個字符串的info方法為:"+clazz.getMethod("info", String.class)); System.out.println("ClassTest里面沒帶一個字符串的info方法為:"+clazz.getMethod("info")); //獲取class對象所對應的類上的全部注釋 Annotation[] anns=clazz.getAnnotations(); System.out.println("ClassTest的全部注釋如下"); for(Annotation c : anns){ System.out.println(c); } System.out.println("注意:Annotation信息找不到@SupperssWarnings信息"); System.out.println("該Class元素上的@SupperssWarnings注釋為:" +clazz.getAnnotation(SuppressWarnings.class)) ; //獲取該class對象的全部內部類 Class<?>[] inners=clazz.getDeclaredClasses(); System.out.println("ClassTest的全部內部類如下:"); for(Class c : inners){ System.out.println(c); } //使用Class.forname的方法來加載ClassTest的Inner內部類 Class inClazz =Class.forName("huang.de.wei.ClassTest$Inner"); //通過getDeclaringClass()訪問該類所在的外部類 System.out.println("InClazz對應類的外部類為:"+ inClazz.getDeclaringClass()); System.out.println("ClassTest的包為:"+clazz.getPackage()); System.out.println("ClassTest的父類為:"+clazz.getSuperclass()); // TODO: handle exception } }
運行結果(拋出的異常可能有差異):
類的構造器全部如下
private huang.de.wei.ClassTest()
public huang.de.wei.ClassTest(java.lang.String)
class對象所對應的全部public構造器:
public huang.de.wei.ClassTest(java.lang.String)
ClassTest的全部public方法如下:
public static void huang.de.wei.ClassTest.main(java.lang.String[]) throws java.lang.SecurityException,java.lang.NoSuchMethodException,java.lang.ClassNotFoundException
public void huang.de.wei.ClassTest.info()
public void huang.de.wei.ClassTest.info(java.lang.String)
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
ClassTest里面帶一個字符串的info方法為:public void huang.de.wei.ClassTest.info(java.lang.String)
ClassTest里面沒帶一個字符串的info方法為:public void huang.de.wei.ClassTest.info()
ClassTest的全部注釋如下
@java.lang.Deprecated()
注意:Annotation信息找不到@SupperssWarnings信息
該Class元素上的@SupperssWarnings注釋為:null
ClassTest的全部內部類如下:
class huang.de.wei.ClassTest$Inner
InClazz對應類的外部類為:class huang.de.wei.ClassTest
ClassTest的包為:package huang.de.wei
ClassTest的父類為:class java.lang.Object
值得注意的是:雖然我們定義了ClassTest類時,使用了@supperssWarnings,但程序運行時無法分析出該類里面包含的該注釋,這是因為@supperssWarnings使用了@Retention(value=SOURCE)修飾,這表明@supperssWarnings只能保存在源碼級別上,而通過ClassTest.class獲取該類的運行時class對象,所以程序無法訪問到@supperssWarnings注釋,所以說:對於只能在源碼上保存的注釋,無法通過運行時獲得的class對象訪問。