Java 基礎總結--反射的基本操作

一.反射的概念

JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱爲java語言的反射機制。要想解剖一個類,必須先要獲取到該類的字節碼文件對象。而解剖使用的就是Class類中的方法.所以先要獲取到每一個字節碼文件對應的Class類型的對象.
通俗的說,java虛擬機在加載類的時候會找到對應的class文件,並生成一個class對象,每個類class對象只會生成一次,就算是基本數據類型,也會有一個class對象,所以說在java中一切皆對象,這裏引入一位博主的圖片,我覺得概括的很好



圖片來自[https://blog.csdn.net/sinat_38259539/article/details/71799078]


二.反射中使用的方法

1.獲取class對象的方法

package Test;

public class ReflectTest {
    public static void main(String[] args) throws Exception{
        Student s1 = new Student();
        Class stu1 = s1.getClass();
        System.out.println(stu1.getName());
        
        Class stu2 = Student.class;
        System.out.println(stu1==stu2);

        //最常用方法
        Class stu3 = Class.forName("Test.Student");
        System.out.println(stu1==stu3);
    }
}
class Student{  
}

一般常用第三種方法,第一個都有類的實例了,第二個需要導入類包,第三個forName中的路徑爲絕對路徑。

2.獲得類的方法並調用

package Test;

import java.lang.reflect.Method;
public class ReflectTest {
    public static void main(String[] args) throws Exception{
        ReflectTest obj = new ReflectTest();
        Method m1 = obj.getClass().getMethod("age",int.class);
        m1.invoke(obj, new Integer(27));
        m1.invoke(obj, 28);
        Method m2 = obj.getClass().getMethod("age",Integer.class);
        m2.invoke(obj, new Integer(27));
        m2.invoke(obj,28);
    }
    public void age(int age) {
        System.out.println("int age = " + age);
    }
    public void age(Integer age) {
        System.out.println("Integer age = " + age);
    }
}

輸出:
int age = 27
int age = 28
Integer age = 27
Integer age = 28

3.獲取類信息的系列方法

以Singer類爲例子

package Test;
public class Singer {   
    public String name;
    public String sex;
    private String song;

    public Singer() {
    }
    public Singer(String name, String sex, String song) {
        this.name = name;
        this.sex = sex;
        this.song = song;
    }

    public void setName(String name) {
        this.name = name;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public void setSong(String song) {
        this.song = song;
    }

    public String getName() {
        return name;
    }
    public String getSex() {
        return sex;
    }
    public String getSong() {
        return song;
    }
}
package Test;
import java.lang.reflect.*;

public class ReflectTest1 {
    public static void main(String[] args) throws Exception{
        Class clazz = Class.forName("Test.Singer");
    
    //獲得所有方法
    Method[] methods = clazz.getDeclaredMethods();
    for (Method m: methods) {
        System.out.println(m);
    }
    
    //獲取所有成員屬性變量
    Field[] fields = clazz.getDeclaredFields();
    for (Field f: fields) {
        System.out.println(f);
    }
    
    //獲取所有構造方法
    Constructor[] constructors = clazz.getDeclaredConstructors();
    for (Constructor c: constructors) {
        System.out.println(c);
    }
  }
}

輸出:

    public java.lang.String Test.Singer.getName()
    public void Test.Singer.setName(java.lang.String)
    public java.lang.String Test.Singer.getSex()
    public java.lang.String Test.Singer.getSong()
    public void Test.Singer.setSex(java.lang.String)
    public void Test.Singer.setSong(java.lang.String)
    public java.lang.String Test.Singer.name
    public java.lang.String Test.Singer.sex
    private java.lang.String Test.Singer.song
    public Test.Singer()
    public Test.Singer(java.lang.String,java.lang.String,java.lang.String)


三. 總結

  • 獲得Class對象
  • 調用Class的方法
  • 使用反射API來操作信息
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章