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

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

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

難度入門
時長 1小時20分
學習人數
綜合評分9.67
760人評價 查看評價
9.9 內容實用
9.6 簡潔易懂
9.5 邏輯清晰
  • new是靜態加載,在編譯時刻就需要加載類
    查看全部
  • 類的實例對象的三種表示方式 Class cl = Foo.class; Class c2 = foo1.getClass(); Class c3 =Class.forName("...Foo");
    查看全部
    0 采集 收起 來源:Class類的使用

    2018-03-22

  • 任何一個類都有一個隱含的靜態成員變量class
    查看全部
    0 采集 收起 來源:Class類的使用

    2015-04-12

  • 類是對象,是java.lang.Class類的實例對象
    查看全部
    0 采集 收起 來源:Class類的使用

    2015-04-12

  • 集合泛型是為了防止在編譯時出錯,
    查看全部
  • 要想得到類的方法或其他信息,首先得到類的類類型
    查看全部
  • & 通過反射了解集合泛型的本質 /** *泛型只是為了在編譯之前檢驗錯誤,編譯之后不存在泛型了 *集合中裝的對象一般都是一樣的所以需要泛型限制 *繞過編譯就繞過了泛型的檢驗 ,通過反射調用方法來繞過編譯 */ public class ClassEnum { public static void main(String [] args) throws Exception{ ArrayList al1 =new ArrayList(); ArrayList<String> al2 = new ArrayList<String>(); //al2.add(10); //在這里加入10 是不行的,因為有泛型的限制 al2.add("hello"); //下面的輸出結果是true,所以al1,al2的類類型是一樣的 System.out.println(al1.getClass()==al2.getClass()); Class c =al1.getClass(); Method m = c.getMethod("add", Object.class); m.invoke(al2, 10); System.out.println(al2); //輸出[hello, 10] 說明繞過了泛型的限制,泛型在編譯后就不存在啦 } }
    查看全部
  • & 方法的反射的操作 如何獲取某一個方法, 方法的操作method,invoke(對象,參數列表) 和對象名.方法操作方法不同的是:通過反射操作方法是繞過編譯的 /** *通過反射操作方法。。。是繞過編譯的 */ public class ClassDemo3 { public static void main(String [] args) throws Exception{ Class c = Class.forName("com.reflact.Demo"); Method m1 = c.getMethod("add", int.class ,int.class); m1.invoke(c.newInstance(), 10,20); System.out.println("================="); Method m2 =c.getMethod("changeString", String.class , String.class); m2.invoke(c.newInstance(), "hello","WORLD"); } } class Demo{ public void add(int i ,int j){ System.out.println("結果:"+(i+j)); } public void changeString(String str1 , String str2){ System.out.println(str1.toUpperCase()+str2.toLowerCase()); } }
    查看全部
  • & 獲取成員變量及構造方法的信息 //構造方法被封裝在Constructor類中 public static void getConstructor(Object obj) throws SecurityException, NoSuchMethodException{ Class c = obj.getClass(); //getConstructors() 得到所有public構造函數的信息 Constructor [] constructor= c.getConstructors(); for(Constructor cst : constructor){ System.out.print("構造方法名稱是:"+cst.getName()+"("); for(Class para :cst.getParameterTypes()){ System.out.print(para.getName()+","); } System.out.println(")"); } } public static void getFiled(Object obj){ Class c = obj.getClass(); //getFields()是得到所有public的成員變量,一般不用這個方法 //.getDeclaredFields() 得到該類自己申明的成員變量的信息 private的變量也可以得到 //Field [] field = c.getFields(); Field [] field = c.getDeclaredFields(); for(Field f : field){ System.out.println("成員變量"+f.getType().getName()+" "+f.getName()); } }
    查看全部
  • & 獲取類的信息 基本數據類型,void關鍵字都有類類型 成員變量也是對象是java.lang.reflact.field 獲得方法信息 public class MethodInfo { public static void getInfo(Object obj){ //得到類的類類型 Class c = obj.getClass(); //通過該類的類類型得到類的名字 System.out.println("類名是:"+c.getName()); //getMethods()是獲得所有public方法,包括從父類繼承過來的 //getDeclaredMethods() 是獲得自己定義的方法 Method [] m = c.getMethods(); for(Method m1 : m){ //獲得方法的返回值類型 (得到的是返回值類型的類類型) Class paraReturnType = m1.getReturnType(); System.out.print(paraReturnType.getName()+" "); //獲得方法的名稱 System.out.print(m1.getName()+"("); //獲得方法的參數列表的類的類類型 for(Class para : m1.getParameterTypes()){ System.out.print(para.getName()+","); } System.out.println(")"); } } }
    查看全部
  • & class 動態加載類的方法 編譯時加載的類是靜態加載,運行時是動態加載 import java.lang.reflect.*; public class Office{ public static void main(String [] args) throws Exception{ //new 的方式來實例化,是在編譯時就加載是靜態加載 //只定義了類Excel ,想讓程序能運行,就要用到動態加載了 if("Excel".equals(args[0])){ /*Excel e = new Excel(); e.start();*/ //類的動態加載 Class c = Class.forName(args[0]); //方法1 Object obj = c.newInstance(); for(Method m: c.getMethods() ){ if(m.getName().equals("start")){ m.invoke(obj); } } //方法2 /*可通過給Excel world 類定義一個接口 InterfaceTest, 讓 他們都實現這個接口,實現這個規范 就可以 InterfaceTest ic = (InterfaceTest)c.newInstance(); ic.start(); 即可 利用多態實現 */ } } } class Excel{ public void start(){ System.out.println("excel"); } } /*class World{ public void start(){ System.out.println("world"); } } */ 小結: 動態加載類的好處: 增加程序的靈活性,避免因為一個類沒有而使其他的都編譯不過,我們可以在程序中判斷該類是否存在,且使用動態加載避免編譯不過的問題。。而且,我們這里如果新增加一個world類,我們只需編譯world類,主功能類不需改變。。(一些程序的更新就是這樣做的)
    查看全部
  • class類: 類也是對象,類是java.lang.Class類的實例對象 there is a class named Class 任何一個類都是Class的實例對象,這個實例對象有三種表現方式 & 案例(得到class type 的三種方法 ) public class ClassDemo1 { public static void main(String [] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException{ //Foo這個類的實例對象如何表示 Foo foo1 =new Foo(); //foo1就是Foo的實例 //Foo是Class的實例,class類的實例對象如何表示 //任何一個類的實例對象都有三種表示方式 Class c1 = foo1.getClass(); // 1.已知該類的一個實例對象 Class c2 = Foo.class; //2.已知類名,調用靜態成員 System.out.println(c1==c2);//true,一個類只有一個class Type(類的類類型) Class c3 = Class.forName("com.reflact.Foo"); //3.已知類名,調用Class中的forName方法 System.out.println(c3==c2); //true //通過類的class Type 得到該類的實例對象 Foo foo2 = (Foo)c1.newInstance(); //就可以通過該實例調用該類中方的方法了 foo2.info(); } } class Foo{ public void info(){ System.out.println("info function........"); } }
    查看全部
  • 類是對象,類是java.lang.Class類的實例對象 Class c1 = Foo.class; 任何一個類都有一個隱含的靜態成員 Class c2 = foo1.getClass(); 類也是對象,是Class類的實例對象。 Class c3 = null; c3 = Class.forName("com.imooc.reflect.Foo")
    查看全部
    0 采集 收起 來源:Class類的使用

    2018-03-22

  • java 語言中,萬事萬物皆對象 只有基本數據類型和靜態的不是對象 類是對象,類是java.lang.Class類的實例
    查看全部
    0 采集 收起 來源:Class類的使用

    2015-04-10

  • 類是對象,類是java.lang.Class類的實例對象 Class c1 = Foo.class; 任何一個類都有一個隱含的靜態成員 Class c2 = foo1.getClass(); 類也是對象,是Class類的實例對象。 Class c3 = null; c3 = Class.forName("com.imooc.reflect.Foo")
    查看全部
    0 采集 收起 來源:Class類的使用

    2018-03-22

舉報

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

微信掃碼,參與3人拼團

微信客服

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

幫助反饋 APP下載

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

公眾號

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

友情提示:

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