java.lang.Class -- 反射機制


1反射機制是什么

反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。

2反射機制能做什么

反射機制主要提供了以下功能: 

  • 在運行時判斷任意一個對象所屬的類;

  • 在運行時構造任意一個類的對象;

  • 在運行時判斷任意一個類所具有的成員變量和方法;

  • 在運行時調用任意一個對象的方法;

  • 生成動態代理。

3反射機制的相關API

通過一個對象獲得完整的包名和類名

package edu.pri.lime.test;

public class TestReflect {

    public static void main(String[] args){
        TestReflect reflect = new TestReflect();
//        通過一個對象獲得完整的包名和類名
        System.out.println(reflect.getClass().getName());
    }
}

實例化Class類對象

package edu.pri.lime.test;

public class TestReflect {

    public static void main(String[] args) throws ClassNotFoundException{
        
        Class<?> clazzA = Class.forName("edu.pri.lime.test.TestReflect");
        Class<?> clazzB = new TestReflect().getClass();
        Class<?> clazzC = TestReflect.class;
        
        System.out.println(clazzA.getName());
        System.out.println(clazzB.getName());
        System.out.println(clazzC.getName());
    }
}

獲取一個對象的父類與實現的接口

package edu.pri.lime.test;

import java.io.Serializable;

public class TestReflect implements Serializable{

    private static final long serialVersionUID = -3407476067923921222L;

    public static void main(String[] args) throws ClassNotFoundException{
        
        Class<?> clazz = Class.forName("edu.pri.lime.test.TestReflect");
//        獲取父類
        Class<?> clazzSup = clazz.getSuperclass();
        System.out.println(clazzSup.getName());
        
//        獲取所有接口
        Class<?> clazzInte[] = clazz.getInterfaces();
        for(Class<?> in : clazzInte){
            System.out.println(in.getName());
        }
    }
}

獲取某個類中的全部構造函數

package edu.pri.lime.test;

import java.io.Serializable;
import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;

public class TestReflect implements Serializable{
    private static final long serialVersionUID = -3407476067923921222L;

    private int id;
    private String name;

    public TestReflect() {
        super();
        // TODO Auto-generated constructor stub
    }

    public TestReflect(int id) {
        super();
        this.id = id;
    }

    public TestReflect(String name) {
        super();
        this.name = name;
    }

    public TestReflect(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }

    public static void main(String[] args) throws ClassNotFoundException{
        
        Class<?> clazz = Class.forName("edu.pri.lime.test.TestReflect");
//        獲取所有構造函數
        Constructor<?>[] constructors = clazz.getConstructors();
        for(Constructor<?> con : constructors){
//            獲取構造函數所有參數類型
            Class<?>[] paramTypes = con.getParameterTypes();
            System.out.print(Modifier.toString(con.getModifiers()) + " ");
            System.out.print(con.getName() + "(");
            for(int i = 0;i < paramTypes.length;i++){
                if(i < paramTypes.length - 1){
                    System.out.print(paramTypes[i].getName().substring(paramTypes[i].getName().lastIndexOf(".") + 1) + ",");
                }else{
                    System.out.print(paramTypes[i].getName().substring(paramTypes[i].getName().lastIndexOf(".") + 1));
                }
            }
            System.out.println(");");
        }
    }
}

通過反射機制實例化一個類的對象


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM