反射

框架設(shè)計的靈魂
框架:半成品軟件??梢栽诳蚣艿幕A(chǔ)上進行軟件開發(fā),簡化編碼。

什么是反射:將類的各個組成部分封裝稱其他對象

好處:
1.可以在程序運行過程中,操作這些對象。
2.可以接偶,提高程序的可擴展性。

反射類:Person.class

public class Person {
    private String name;
    private int age;

    public String a;
    protected String b;
    String c;
    private String d;

    private Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Person() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", a='" + a + '\'' +
                ", b='" + b + '\'' +
                ", c='" + c + '\'' +
                ", d='" + d + '\'' +
                '}';
    }

    private void eat(String str){
        System.out.println("eat....."+str);
    }
}

獲取Class對象的方式

1.Class.forName("全類名"):將字節(jié)碼文件加載到內(nèi)存
#多用于配制文件,將類名定義在配制文件中。讀取文件,加載類
2.類名.class:通過類名的屬性.class獲取
#多用于參數(shù)的傳遞
3.對象.getClass():getClass在Object類中定義
#多用于對象獲取字節(jié)碼

    Class personClass1 = Person.class;
    Class personClass2 = Class.forName("cn.test.Person");
    Class personClass3 = (new Person()).getClass();
    System.out.println(personClass1);
    System.out.println(personClass2);
    System.out.println(personClass3);

    System.out.println(personClass1 == personClass2);
    System.out.println(personClass1 == personClass3);

personClass1 == personClass2 == personClass3
結(jié)論:同一個字節(jié)碼文件(.class)在一次程序運行過程中,只會被加載一次,不論通過哪一種方式獲取

Class對象的功能

1.獲取成員變量
getFields: 獲取public成員變量
getDeclaredFields:獲取所有成員變量
getField(String name):獲取public具體的成員變量
getDeclaredField(String name):獲取具體的成員變量
獲取field值,設(shè)置field值

    Class personClass = Person.class;
    Object personClassInstance = personClass.newInstance();//創(chuàng)建實例對象

    Field name = personClass.getDeclaredField("name");
    name.setAccessible(true); //暴力反色號
    Object o = name.get(personClassInstance);//獲取值
    System.out.println(o);

    name.set(personClassInstance,"zhang");//設(shè)置值
    Object o1 = name.get(personClassInstance);
    System.out.println(o1);

2.獲取構(gòu)造方法
getConstructors()
getConstructor(Class<?>... parameterTypes)//不帶Declared是獲取public修飾的構(gòu)造方法
getDeclaredConstructors()
getDeclaredConstructor(Class<?>... parameterTypes) 參數(shù)

    //獲取構(gòu)造方法
    Constructor[] constructors = personClass.getDeclaredConstructors();
    for (Constructor constructor : constructors) {
        System.out.println(constructor);
    }

    Constructor declaredConstructor = personClass.getDeclaredConstructor(String.class, int.class);
    declaredConstructor.setAccessible(true);
    Object zhangj = declaredConstructor.newInstance("zhangj", 30);
    System.out.println(zhangj);

3.獲取成員方法
getMethods()
getMethod(String name, Class<?>... parameterTypes)
getDeclaredMethods()
getDeclaredMethod(String name, Class<?>... parameterTypes)//name:方法名;parameterTypes:參數(shù)列表

class Person {
    private void eat(String str){
        System.out.println("eat....."+str);
    }
}
    //獲取成員方法
    Method[] methods = personClass.getDeclaredMethods();
    for (Method method : methods) {
        System.out.println(method);
    }
    Method eatMethod = personClass.getDeclaredMethod("eat", String.class);
    eatMethod.setAccessible(true);
    eatMethod.invoke(personClassInstance,"面");

4.獲取類名

    personClass.getName();
    personClass.getPackage().getName();
    personClassInstance.getClass().getName();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 反射是框架設(shè)計的靈魂 軟件框架:軟件本成品,能夠幫助我們提高開發(fā)效率。Spring,SpringMVC,Mybat...
    六藝str閱讀 298評論 0 0
  • 1.1 框架的概念 ? 半成品軟件。可以在框架的基礎(chǔ)上進行軟件開發(fā),簡化編碼。學習框架并不需要了解反射,但是要...
    AaFaa閱讀 349評論 0 0
  • 前言(來自文章https://blog.csdn.net/qq_44543508/article/details/...
    杜艷_66c4閱讀 345評論 0 0
  • 反射機制 由于需要通過外部文件配置,在不修改源碼情況下,來控制程序,是符合設(shè)計模式的ocp原則(開閉原則) 反射機...
    笑火云天閱讀 206評論 0 0
  • 反射 框架設(shè)計的靈魂 Java中的反射顧名思義就是將類的各個組成部分封裝為其他對象。使用這些封裝后的對象可以進行一...
    So_ProbuING閱讀 381評論 2 0

友情鏈接更多精彩內(nèi)容