java反射獲取類信息


1 、Class.forName("com.wzh.test.loadClass"); 
  Class.forName("com.mysql.jdbc.Driver");  加載類到虛擬機

首先你要明白在java裏面任何class都要裝載在虛擬機上才能運行。
這句話就是裝載類用的(和new 不一樣,要分清楚)。
jvm會執行靜態代碼段,你要記住一個概念,靜態代碼是和class綁定的,class裝載成功就表示執行了你的靜態代碼了。
而且以後不會再走這段靜態代碼了

 

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(String str) {
        System.out.println("執行有參數的info方法" + ",其實str參數值:" + str);
    }

    // 定義一個測試用的內部類
    class Inner {

    }

    public static void main(String[] args) throws Exception {
        // 下面代碼可以獲取ClassTest對應的Class
        Class<ClassTest> clazz = ClassTest.class;
        // 獲取該 Class 對象所對應類的全部構造器
        Constructor[] ctors = clazz.getDeclaredConstructors();
        System.out.println("ClassTest 的全部構造器如下:");
        for (Constructor c : ctors) {
            System.out.println(c);
        }
        // 獲取該 Class 對象所對應類的全部 public 方法
        Constructor[] publicCtors = clazz.getConstructors();
        System.out.println("ClassTest 的全部 public 構造器如下 :");
        for (Constructor c : publicCtors) {
            System.out.println(c);
        }
        // 獲取該 Class 對象所對應類的指定方法
        Method[] mtds = clazz.getMethods();
        System.out.println("ClassTest 的全部 public 方法如下:");
        for (Method md : mtds) {
            System.out.println(md);
        }
        // 獲取該 Class 對象所對應類的指定方法
        System.out.println("ClassTest 裏帶一個字符串參數的 info 方法爲:"
                + clazz.getMethod("info", String.class));
        //獲取該 Class 對象所對應類的上的全部註釋
        Annotation[] anns=clazz.getAnnotations();
        System.out.println("ClassTest 的全部 Annotattion 如下:");
        for (Annotation an : anns) {
            System.out.println(an);
        }
        System.out.println("該 Class 元素上的 @SuppressWarnings 註釋爲:"+
        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("ClassTest$Inner");
        //通過getDeclaringClass()防僞該類所在的外部類
        System.out.println("inClazz 對應類所在的外部類爲:"+inClazz.getDeclaredClasses());
        System.out.println("ClassTest 的包爲:"+clazz.getPackage());
        System.out.println("ClassTest 的父類爲:"+clazz.getSuperclass());
    } 
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章