java學習----反射

 目錄

 1.什麼是反射java

  2.反射的運用jvm

  3.總結ide

 

1、什麼是反射

  反射:反射是指計算機程序在運行時(Run time)能夠訪問、檢測和修改它自己狀態或行爲的一種能力   ----by  維基百科this

  java中的反射也是如此,利用反射的原理咱們能夠在程序運行時候的可以動態的建立對象,而且調用對象的方法和屬性spa

  它的做用是:1.在運行時判斷任意一個對象類型code

        2.在運行時候可以構造任意一個對象對象

        3.在運行時候判斷一個類的屬性和方法blog

  反射在實際開發中的運用主要是在編寫第三方jar包中比較多。咱們能夠運用反射對程序進行反編譯。生命週期

2、反射的運用

  上面涉及到反射是在java程序運行時纔出現的。咱們知道java程序運行的機制是先編譯再運行。開發

  編譯後咱們會獲得一個以.class結尾的字節碼文件。咱們要運行一個java程序,只須要這個文件+JVM虛擬機便可

  那麼就簡單瞭解一下jvm的類加載機制(類的生命週期)吧

 

  

  在java中反射的核心類是Class類

  接下來就看看反射的核心類Class吧。

   建立反射(Class)對象有三中方法

  1.Class.forName(全路徑名);

    2.類型  對象名 = new 類型();

   對象名.getClass();

  3.類名.class;

 ps:該類型無論建立多少個對象,經過對象

獲取的Class對象,都是同一個。

下面看一個反射的實例吧:

  

package com.demo.forname; public class Student { private String name; private Integer id; public int age; private Student(int id){ this.id=id; } public Student(){ System.out.println("執行了無參的構造方法"); } public Student(String name, Integer id, int age) { super(); this.name = name; this.id = id; this.age = age; } @Override public String toString() { return "Student [name=" + name + ", id=" + id + ", age=" + age + "]"; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
須要進行反射操做的類
package com.demo.forname; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class ReflectNewObject { public static void main(String[] args) throws Exception { //獲取反射對象
        Class<Student> obj = (Class<Student>) Class.forName("com.demo.forname.Student"); //調用無參構造方法
        Student stu1 = obj.newInstance(); //選擇須要調用的構造方法
        Constructor constructor = obj.getConstructor(String.class,Integer.class,Integer.TYPE); //有Constructor對象調用構造方法
        Student stu2 = (Student)constructor.newInstance("張三",23,23); System.out.println(stu2); //------------------------------------------------------------------------------------ //獲取全部的屬性(只含公開屬性,包含父類的屬性)
        Field[] f = obj.getFields(); for (Field field : f) { System.out.println(field); } System.out.println("-----------------------------"); //獲取指定字段的屬性(只包含公開屬性,包含父類的屬性)
        Field f3 = obj.getField("name"); System.out.println(f3); System.out.println("-----------------------------"); //獲取當前類中指定的屬性(只包含本類)
        Field f4 = obj.getDeclaredField("name"); System.out.println(f4); System.out.println("----------------------------"); //獲取本類全部的屬性
        Field[] f2 = obj.getDeclaredFields(); for (Field field : f2) { System.out.println(field); } System.out.println("****************************"); //------------------------------------------------------------------------------------- //獲取全部的方法(只包含公開的,包含父類(別忘了Object類中的方法))
        Method[] m1 = obj.getMethods(); for (Method method : m1) { System.out.println(method); } System.out.println("****************************"); //獲取本類中全部的方法(不包含父類)
        Method[] m2 = obj.getDeclaredMethods(); for (Method method : m2) { System.out.println(method); } System.out.println("****************************"); //獲取指定方法(須要公開的方法,不包含父類)後面的參數類型寫該方法的參數的Class對象,若是沒有就寫null或不寫
        Method m3 = obj.getMethod("toString"); System.out.println(m3); //獲取當前類中的指定方法(全部方法)
        System.out.println("****************************"); Method m4 = obj.getDeclaredMethod("tec",int.class,String.class); //因爲這裏的m4方法是私有的這裏利用反射咱們可讓方法變成公開的來執行
        m4.setAccessible(true); System.out.println(m4); //調用方法(,這裏方法沒有參數則寫null,可是第一個參數必須是這個方法的對象)
        m4.invoke(stu1,1,"789"); } }
利用反射運行代碼

 

三、總結

  java反射機制因爲是在編譯後且是在JVM運行時進行的操做,因此咱們能夠運用反射完成日常作不到的事。好比:集合裏放不一樣的類型、調用私有的方法等等。

這裏java的優點就體現出來了----增長了代碼的靈活性可是因爲java反射的這些代碼還要從新進行編譯,因此利用反射寫出來的代碼運行效率是很低的,而且利用反射

寫代碼是很是繁瑣的。因此善用java反射才能寫出更好的代碼。

相關文章
相關標籤/搜索