1. 程式人生 > 實用技巧 >Java反射機制詳情(2)

Java反射機制詳情(2)

| |目錄

  • 執行環境
  • Java語言的反射機制
  • Class中的常用方法(獲得類的構造方法)
  • Class中的常用方法(獲得類的屬性)
  • Class中的常用方法(獲得類的方法)
  • 反射動態呼叫類的成員

1.執行環境

JDK8+lntellij IDEA 2018.3

2.Java 語言的反射機制

  • Java 反射是Java語言的一個很重要的特徵,它使得Java具有了“動態性”。
  • Java提供了一套機制來動態獲取類的資訊以及動態呼叫物件的方法的功能,這套機制就叫——反射
  • 反射機制是如今很多流行框架的實現基礎,其中包括Struts、Spring、Hibernate等。

3.Class中的常用方法(獲得類的構造方法)

  • getConstructors():獲得類的所有的public型別的構造方法。
  • getDeclaredConstructors():獲得類所有的構造方法
  • getConstructor(Class[] parameterTypes):獲得類的特定public的構造方法, parameterTypes 引數指定構造方法的引數型別。
  • getDeclaredConstructor(Class[] parameterTypes):獲得類指定的所有的構造方法

4.Class中的常用方法(獲得類的屬性)

  • getFields():獲得類的public型別的屬性。
  • getDeclaredFields():獲得類本身的所有屬性
  • getField(String):獲得指定名字的public型別的屬性物件
  • getDeclaredField(String)獲得類自己的指定名字的屬性物件

  Field類:

  • getModifiers():獲得屬性的修飾符(Modifier.toString(int)顯示對應的修飾符型別)
  • getType() : 獲得屬性的型別 

5.Class中的常用方法(獲得類的方法)

  • getMethods():獲得類的public型別的方法。
  • getDeclaredMethods():獲得類的所有方法。
  • getMethod(String name, Class[] parameterTypes):獲得類的特定public的方法, name引數指定方法的名字, parameterTypes 引數指定方法的引數類getDeclaredMethod(String name, Class[] parameterTypes)

  Method類:

  • getParameterTypes() :獲得方法的所有引數型別
  • getReturnType():獲得方法的返回值型別

6.反射動態呼叫類的成員

呼叫方法步驟:

  設定呼叫方法的引數列表(Class[])

  獲得呼叫方法的物件(Method)

  設定呼叫方法的引數的值(Object[])

  普通方法:invoke(obj,values);

  構造方法:newInstance(values)

呼叫屬性步驟:

  根據屬性名字獲得屬性物件(Field)

  賦值:set(obj,value)

  取值:get(obj) 如果需要強制訪問類的私有成員,則需要設定: setAccessible(true);


Øjdbc.properties程式碼

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8
user=root
password=

Ø/*jdbc讀到記憶體中反射體驗*/程式碼
public class DBUtil{
    static Properties properties = new Properties();
    private static  String DRIVER;
    private static  String URL;
    private static  String USER;
    private static  String PASSWORD;
    public static void main(String[] args) throws IOException {
        System.out.println("main:"+"hello");
        Connection connection=DBUtil.getConnection(URL,USER,PASSWORD);
    }


    static {
        String path="jdbc.properties";
        InputStream is= DBUtil.class.getClassLoader().getResourceAsStream(path);
        try {
            properties.load(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
        DRIVER=  properties.getProperty("driver");
        URL= properties.getProperty("url");
        USER= properties.getProperty("user");
        PASSWORD=properties.getProperty("password");
        System.out.println("DRIVER:"+DRIVER+"URL:"+URL+"");
        try {
            Class.forName(DRIVER);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    static  Connection connection= null;
    public static Connection getConnection(String url,String user,String password){
        try {
            connection= DriverManager.getConnection(url,user,password);
            System.out.println("connection:"+connection);
        } catch (SQLException e) {
            e.printStackTrace();
        }catch (Exception e){
            e.printStackTrace();
        }
        return connection;
    }

}
Ø三種獲取類,程式碼
public class ReflectDemo1 {
    public static void main(String[] args) {
        Student student = new Student();
        //1.  object.getClass(); 引用型別, .getClass(),定義在Object物件
        Class clzStu1=student.getClass();

        //2. .class 適用於所有的資料型別
        Class clzStu2=Student.class;

        //3. Class.forName(""); 先把類載入到記憶體中,得到類物件
        Class clzStu3=null;

        try {
            clzStu3=Class.forName("com.javaboy.pojo.Student");

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        System.out.println(clzStu1==clzStu2);
        System.out.println(clzStu2==clzStu3);
        System.out.println(clzStu1==clzStu3);
    }
}

Ø效果圖

Ø總結

  Class是一個特殊的類,

  它的例項用來表示一個.class檔案在記憶體中的存在形勢。

  反射就是照鏡子,照出類的內部結構。 利用反射,可以在執行狀態下初始化類。


心得:
  為什麼要努力?
  因為還有很多人毫不費力的過著我想要的生活
  因為我對這個世界還有慾望,為了更自由,為了被尊重
  為了不把世界讓給我討厭的人。
  為了對得起未來的自己
  如果你從此時此刻開始努力,最壞的結果,不過是大器晚成
  今天是你餘生中最年輕的一天,從今天去開始努力,即使暫時看不到希望
  也要相信自己,相信明天你會感謝今天的努力。