亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

反射——Java高級開發必須懂的

難度入門
時長 1小時20分
學習人數
綜合評分9.67
760人評價 查看評價
9.9 內容實用
9.6 簡潔易懂
9.5 邏輯清晰
  • Method
    查看全部
  • Class類
    查看全部
  • //Foo的實例對象如何表示 Foo foo1 = new Foo();//foo1就表示出來了. //Foo這個類 也是一個實例對象,Class類的實例對象,如何表示呢 //任何一個類都是Class的實例對象,這個實例對象有三種表示方式 //第一種表示方式--->實際在告訴我們任何一個類都有一個隱含的靜態成員變量class Class c1 = Foo.class; //第二中表達方式 已經知道該類的對象通過getClass方法 Class c2 = foo1.getClass(); /*官網 c1 ,c2 表示了Foo類的類類型(class type) * 萬事萬物皆對象, * 類也是對象,是Class類的實例對象 * 這個對象我們稱為該類的類類型 */ //不管c1 or c2都代表了Foo類的類類型,一個類只可能是Class類的一個實例對象 System.out.println(c1 == c2); //第三種表達方式 Class c3 = null; try { c3 = Class.forName("com.imooc.reflect.Foo"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(c2==c3); //我們完全可以通過類的類類型創建該類的對象實例---->通過c1 or c2 or c3創建Foo的實例對象 try { Foo foo = (Foo)c1.newInstance();//需要有無參數的構造方法 foo.print(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); }
    查看全部
    0 采集 收起 來源:Class類的使用

    2018-03-22

  • 方法的反射
    查看全部
  • Class類
    查看全部
  • Class類
    查看全部
    0 采集 收起 來源:Class類的使用

    2016-01-18

  • JAVA - Reflect專題
    查看全部
    0 采集 收起 來源:Class類的使用

    2016-01-18

  • Java反射機制——通過反射了解集合泛型的本質 1:反射的操作都是編譯之后的操作;就是運行階段 2:java中集合的泛型是防止錯誤輸入的;只在編譯階段有效,只要繞過編譯就無效啦 我們可以通過方法的反射來操作,繞過編譯
    查看全部
  • text note
    查看全部
  • 通過Class,Method來認識集合泛型的本質 反射的操作都是編譯之后的操作(即運行時刻的操作),因為源文件編譯之后就是.class文件.反射操作就是通過類名或者對象名獲取到Class對象,再對Class對象的操作.即Class、Method、Field等對象都是繞過編譯,在運行時刻才執行的. List list1=new ArrayList(); List<String> list2=new ArrayList<String>(); 因為list2設置了泛型,所以不能添加非String類型的參數進集合. Class c1=list1.getClass(); Class c2=list2.getClass(); System.out.println(c1=c1); 如果都沒設置泛型那么其類類型肯定一樣.現在設置了泛型,但此結果卻返回true,說明編譯之后集合是去泛型化的.因此得出結論:Java中集合的泛型,是防止錯誤輸入的,只在編譯階段有效.繞過編譯之后泛型就無效了. 任何一個類,只有一個類類型.就算此類實例了兩個不同屬性值的對象,通過對象獲取得到類的類類型也是一樣的. 驗證方法是:可以通過方法的反射來操作,繞過編譯. public void test(){ Method m=c2.getMethod("add",Object.class); m.invoke(list2,10);//反射操作是運行時刻的操作.程序運行時是沒有問題的,添加集合成功,即集合繞過了編譯階段,泛型也就失效.假如添加成功之后用foreach以字符串類型遍歷,則會發生RuntimeException.因為整型與String類型不匹配. }
    查看全部
  • 獲得方法Method對象,通過此對象的invoke(對象,參數列表)方法去調用此方法. 獲取某個具體方法需要知道方法的名稱和方法的參數列表.在Class類中有getMethod("方法名",參數列表)方法獲取具體的一個方法,其中有兩個參數,第一個參數是要獲取的方法的方法名,第二個參數是要獲取的方法的參數列表的類類型,只能獲取public修飾的,getDeclareMethod(方法名,參數列表)則可以獲取類自己聲明的所有方法,都返回一個Method對象.與getMethods()方法不同,getMethods()方法獲取的是Class對象對應類的所有public方法,返回的是一個Method對象數組,并不能獲取一個確定的方法Method對象. Method類中提供invoke(obj,參數列表)方法通過反射機制調用該Method對象對應的方法,其中obj參數為調用Method對象對應的方法的對象.參數列表參數為調用Method對象對應的方法時需要傳遞的參數,沒有參數的話則忽略.invoke()方法返回Object對象,此Object對象就是調用Method對象對應的方法返回的返回值.用invoke()方法調用方法的方式與對象.方法名()調用方法的方式兩者效果完全一樣. 要獲取一個方法就是獲取類的信息,獲取類的信息首先要獲取類的類類型. Class B{ public void print(){ A a=new A(); Class c=a.getClass(); Method m=c.getDeclareMethod("add",int.class,int.class)//參數列表類類型有多少個就寫多少個. Object o=m.invoke(a,10,15);//以前是直接a.add()調用方法.用反射即Method對象通過invoke()方法反操作a對象來調用Method對象對應的方法. } } Class A{ public void add(int a , int b){ System.out.println(a+b); } }
    查看全部
  • 3.獲取Class對象所對應類的構造方法.構造方法也是一個對象,每一個構造方法對應一個Constructors對象. Class類的getConstructors()方法可以獲取Class對象所對應類的所有public的構造方法,返回Constructor類型的數組.也可以用getDeclaredConstructors()方法獲取Class對象所對應類的自身所有構造方法,不分訪問權限.返回Constructor類型的數組. 構造方法沒有返回值類型.可有參數,因此Constructor類中提供了getParameterTypes()方法返回此構造方法參數列表類型的類類型數組. Constructor類的getName()方法可以獲取構造方法的名字. 要得到一個類的信息,首先要得到這個類的類類型,即該類對應的Class對象. public void print(){ Class c=Foo.class; Constructor[] cs=c.getDeclaredConstructors(); for(Constructor cons:cs){ System.out.println(cons.getName()); Class [] c2=cons.getParameterTypes(); for(int i=0; i<c2.length;i++){ System.out.print(c2[i].getName()+","); } } }
    查看全部
  • 3.獲取Class對象所對應類的成員變量,在Java中成員變量也是對象.Field類封裝了關于成員變量的操作,每個成員變量對應一個Field對象. 可以通過Class類的getFields()方法獲取得到此Class對象對應的類的所有的public修飾的成員變量,返回的是Field類型的數組.通過遍歷輸出. 也可以通過Class類的getDeclaredFields()方法獲取Class對象對應類自身的成員變量,不分訪問權限.返回的也是Field類型的數組. Field類提供了getType()方法返回成員變量的類型的類類型(即成員變量類型.class).Field中也有getName()方法返回成員變量的名字. public void println{ Class c=Foo.class; Field []fs=c.getDeclaredFields(); for(Field field:fs){ Class fieldType=field.getType(); System.out.println(fieldType.getName()+" "+field.getName()); } }
    查看全部
  • Class類的常用方法 要獲取類的信息,首先要獲取類的類類型(Class對象). 1.獲取Class對象所對應類的名稱. getName();//類的全稱 getSimpleName();//直接類名 2.獲取Class對象所對應類的方法,在Java中方法也是對象,每個方法對應一個Method對象. 通過Class類的getMethods()方法返回的是Class對象所對應的類的所有public修飾的方法(包括父類繼承來的),返回Method對象數組,再遍歷數組.通過Method類的getName()方法即可獲取到方法名. 也可以通過getDeclareMethods()方法獲取Class對象所對應的類的所有本類方法(不分訪問權限),不包括繼承父類的方法,返回的也是一個Method對象數組. Method類中也提供一個getReturnType()方法,得到方法的返回值類型,返回的是返回值的類類型.(返回值類型.class,即Class類的對象) Method類中有getParameterTypes()方法得到方法的參數類型,返回的是參數列表的類型的類類型數組. public void print(){ Class c=Foo.class; Method[] ms=c.getMethods(); for(int i=0;i<ms.length;i++){ Class returnType=ms[i].getReturnType(); Class []paramType=ms[i].getParameterTypes(); System.out.println("方法返回值類型:"+returnType.getName()+"方法名:"+ms[i].getName()+"方法的參數類型列表:"); for(Class c:paramType){ System.out.print(c.getName()+","); } } }
    查看全部
  • 基本數據類型也存在類類型. Class c1=int.class;//c1表示int的類類型. Class c2=Integer.class//c2表示Integer類的類類型. c1和c2是不一樣的. 一些在類聲明的關鍵字也有其類類型,void、String等. 在Java中,每個類都有一個相應的Class對象,也就是說當我們編寫一個類,編譯完成后,在生成的.class文件中,就會產生一個Class對象,用于表示這個類的類型信息.在運行期間,如果我們要產生某個類的對象,Java虛擬機會檢查該類型的Class對象是否已被加載.如果沒有被加載,JVM會根據類的名稱找到.class文件并加載它.一旦某個類型的Class對象已被加載到內存,就可以用它來產生該類型的所有對象 Class類有getName()方法,獲取當前Class對象所對應類的全稱.
    查看全部

舉報

0/150
提交
取消
課程須知
童鞋們,學習本課程前需要熟悉Java面向對象的思想,并能掌握Java IO輸入輸出流、集合和泛型等知識??蓞⒖寄秸n網Java入門的一、二、三季以及我的文件我做主——Java IO流課程。
老師告訴你能學到什么?
1、能夠理解并應用反射機制。 2、能夠了解反射機制在集合泛型中的應用。 3、有利于更好的學習框架等Java高級技術。

微信掃碼,參與3人拼團

微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

友情提示:

您好,此課程屬于遷移課程,您已購買該課程,無需重復購買,感謝您對慕課網的支持!