反射機制

1.動態(tài)語言

C++,C,JAVA不是動態(tài)語言 JavaScript是一門動態(tài)語言
例如

function test(){
var s="var a=3;var b=5; alter(a+b);"
eval(s);
}

但是Java也具有一定的動態(tài)性

2.反射機制(reflection)

1.程序在運行的時候,可以動態(tài)的加載一個類,對于任何一個加載的類,都能夠知道這個類的所有屬性和方法,對于任何一個對象都能夠調(diào)用這個類的方法和屬性。

Class c=Class.forName(" 包+類名 ")
來自java.lang.Class

2.它可以將數(shù)組,接口,類等等各種放到一個Class對象里,通過這個對象可以調(diào)用類里面的數(shù)據(jù)。

3. Class對象的獲取的三種方法

1.Class.forName();
2.類

3.類.getClass();
示例如下

public class reflection
{
    public static void main(String[] args)
    {
        String name="cn.sst.gao.Stu";
        try
        {
            Class src=Class.forName(name);  //一個類只能對應(yīng)一個Class對象
            Class strClazz=String.class;
            Class src22=name.getClass();
            System.out.println(src.hashCode());     
            System.out.println(strClazz.hashCode());
            System.out.println(src22.hashCode());
            //對于數(shù)組是按維度 和類型進行分類的
            int[] p=new int[10];
            int[] s=new int[20];
            Class srcc=p.getClass();
            Class srcc1=s.getClass();
            System.out.println(srcc.hashCode());
            System.out.println(srcc1.hashCode());
        } catch (ClassNotFoundException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }
}
4. 通過反射返回類的信息

1.獲取類的名字
getName
2.獲取屬性 -->Field -------需要先返回這個類型的對象 ---Class對象.

  • getFields 獲取所有的Public類型的
  • getDeclaredFields 獲取所有的Field
  • getDeclaredField(" 屬性的名字") 獲取某個屬性名字的屬性
    3.獲取方法 --- >Method
  • getDeclaredMethods()得到所有的方法
  • getDeclaredMethod("getAge",null); 得到某個方法 1.傳入方法的名字2,如果有參數(shù)則傳入 類型.class對象
    4.構(gòu)造器 --> Constructor()
  • getDeclaredConstructors() 得到所有的構(gòu)造器
  • getDeclaredConstructor() 得到某個指定的構(gòu)造器 需要傳入?yún)?shù)(如上)
    5.獲得注解 ---->SxtTable
    1.獲得類的注解
  • Class對象.getAnnotations() 獲得所有注解
  • Class對象.getAnnotation(名字.class)獲得某個注解
    2.獲得方法,屬性的注解
  • 先獲取屬性,方法等
  • 方法如上
5.通過反射獲得建立Class對象,并對其中的屬性進行操作

1.獲取Class對象的類的對象

  • 對象 p=Class對象.newInstance();

User p=(User) clazz.newInstance(); //調(diào)用了User的無參構(gòu)造方法

  • 先建立構(gòu)造器 再通過構(gòu)造器進行創(chuàng)建

Constructor<User> c=clazz.getDeclaredConstructor(int.class,int.class,String.class);
User p1=c.newInstance(10001,18,"小風(fēng)");

2.獲取方法

  • .先獲取方法 Method p=Class對象.getDeclaredMethod("方法名",參數(shù));
  • method.invoke(對象, 參數(shù));

User p2=(User) clazz.newInstance();
Method method=clazz.getDeclaredMethod("setId", int.class);
method.invoke(p2, 10);

3.獲取屬性

  • 先獲取屬性 Field p=Class對象.getDeclaredField("名字");
    --------如果是私有的 需要p.setAccessible(true);
  • f.set(p3,20);

User p3=(User) clazz.newInstance();
Field f=clazz.getDeclaredField("age");
f.setAccessible(true);
f.set(p3,20);
System.out.println(p3.getAge());

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

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

  • 不論是 Java 開發(fā) 還是 Android 開發(fā),反射、泛型、注解 都是架構(gòu)設(shè)計中很重要的一個知識點。 為了更好...
    JamFF閱讀 584評論 0 4
  • Idea提示我newInstance();被棄用了,我查了下,使用getDeclaredConstructor()...
    TowuaErio閱讀 337評論 0 0
  • 一、概述 Java反射機制定義 Java反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類中的所有屬性和方法...
    CoderZS閱讀 1,698評論 0 25
  • 什么是java反射: JAVA反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一...
    樂百事52淑熙閱讀 381評論 0 0
  • 1.反射機制是什么: 反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,...
    蠻大人我們走閱讀 395評論 0 0

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