-
new是靜態加載,在編譯時刻就需要加載類查看全部
-
類的實例對象的三種表示方式 Class cl = Foo.class; Class c2 = foo1.getClass(); Class c3 =Class.forName("...Foo");查看全部
-
任何一個類都有一個隱含的靜態成員變量class查看全部
-
類是對象,是java.lang.Class類的實例對象查看全部
-
集合泛型是為了防止在編譯時出錯,查看全部
-
要想得到類的方法或其他信息,首先得到類的類類型查看全部
-
& 通過反射了解集合泛型的本質 /** *泛型只是為了在編譯之前檢驗錯誤,編譯之后不存在泛型了 *集合中裝的對象一般都是一樣的所以需要泛型限制 *繞過編譯就繞過了泛型的檢驗 ,通過反射調用方法來繞過編譯 */ 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")查看全部
-
java 語言中,萬事萬物皆對象 只有基本數據類型和靜態的不是對象 類是對象,類是java.lang.Class類的實例查看全部
-
類是對象,類是java.lang.Class類的實例對象 Class c1 = Foo.class; 任何一個類都有一個隱含的靜態成員 Class c2 = foo1.getClass(); 類也是對象,是Class類的實例對象。 Class c3 = null; c3 = Class.forName("com.imooc.reflect.Foo")查看全部
舉報
0/150
提交
取消