-
class類的使用查看全部
-
Eclipse小技巧:選中一段代碼->右鍵Refactor->Move可以把這段重構成新的方法。查看全部
-
繼承補充 java中: 1-3類似 4父、子的構造方法確實不同,但子類構造方法會隱含調用父類構造方法的super(),因此會遞歸調用父類的構造方法。一般的方法當然是直接繼承,當然重寫過的就算了。 5并不需要“:父類的構造方法”,但子類的構造方法中會隱含調用父類構造方法的super();查看全部
-
泛型補充 注意:泛型的限定作用只在編譯階段起作用,其目的只是為了防止程序員在寫代碼的時候放入了錯誤類型的元素,當編譯完成后,程序執行時,泛型不再起任何限定作用,此時如果利用反射(詳見下文的反射部分),動態創建class類的對象(等于List類),然后利用方法的反射操作來調用add,就可以加入任何類型的元素了,所以繞過了編譯就繞過了泛型。查看全部
-
* 反射的作用在于可以在程序執行的時候動態加載一個類,不需要在編譯的時候靜態的先把類寫好(用傳統的new方法創建對象則要求這個類必須在編譯之前就寫好)。 對之前的寫法進行改造: 1)定義一個統一接口 public abstract interface JK { …//方法 } 2)在需要的代碼段中動態加載類: Class c3 = null; c3 = Class.forName(args[0]); // args[0]可通過命令行輸入Foo //注意要try-catch(Exception e)哦,此處省略 3)用c3獲取類的信息,如前文所述。 4)用c3創建JK對象 JK jk = (JK) c3.newInstance(); 此時就可以用“jk.方法(參數1, 參數2, …)”,或者用方法的反射操作(比如已經獲取了Method m,就可以m.invoke(jk, 參數1, 參數2, …);,和“jk.方法(參數1, 參數2, …)”等效的)來實現jk的功能。 5)其他程序員在定義需要動態加載進來的類時,需要implements這個JK接口。查看全部
-
反射2 - c1還有一些方法獲取Foo類的信息(所以此時什么private都沒用了): c1.getName(),獲得類含包名的全名 c1.getSimpleName(), 獲得類的名稱 Method[] ms = c1.getMethods,獲取類的全部方法(還有c1.getDeclearedMethods()是只獲取類自己聲明的方法(不含父類那繼承下來的))(還支持只獲取類中特定名字的方法,在其參數傳入方法名和參數列表就可以,如Method m = c.getMethod(“print”,int.class,double.class)這樣,注意要try-catch(防止萬一這個方法不存在)),然后就可以遍歷數組,用Class reType = ms[i].getReturnType; reType.getName(); 獲得方法的返回值;用ms[i].getName()獲得方法的名稱;用Class[] paraType = ms[i].getParameterTypes(); paraType[j].getName(); (再遍歷class數組)獲得方法的入參類型。 Constructor[] cs = c1.getDeclearedConstructors();獲取類的(自己聲明的)構造方法。用法與上一段method類似。 Field[] fs = c.getFields();獲取類的全部成員(屬性)變量(還有c1.getDeclearedFields()是只獲取類自己聲明的成員(不含父類那繼承下來的)),然后就可以遍歷數組,用Class fType = fs[i].getType; fType.getName(); 獲得成員的類型,用fs[i].getName()獲取成員的名字。查看全部
-
反射1 * 類其實也是對象,是Class類的對象,例如,創建一個類class Foo{},這個Foo類本身也是一個對象,是Class類的對象。 - 聲明: Class c1 = Foo.class;(說明任何一個類都包含一個隱含的靜態成員class) (類名 對象名(但也是類名)) 或不知道Foo類名但知道其對象名foo1時: Class c2 = foo1.getClass(); (類名 對象名(但也是類名)) 還可以 Class c3 = null; c3 = Class.forName(類的包含包名在內的全名); (這樣,c1 == c2 == c3) 因此,foo1是Foo的對象,Foo是Class的對象。 同時,foo1是c1的對象,c1是Class的對象,因此,通過c1可直接創建Foo的對象: try{ Foo foo2 = (Foo)c1.newInstance(); //通過c1可創建Foo類的對象foo2, //前提是Foo類包含無參構造方法 foo2.方法; //實現foo2的功能(也可以通過方法的反射invoke操作,等效) } catch (InstantiationException e){ e.printStackTrace(); } catch (IllegalAccessException e){ e.printStackTrace(); }查看全部
-
JAVA反射機制是在運行狀態中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意一個方法;這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。 Java反射機制主要提供了以下功能: 在運行時判斷任意一個對象所屬的類;在運行時構造任意一個類的對象;在運行時判斷任意一個類所具有的成員變量和方法;在運行時調用任意一個對象的方法;生成動態代理。查看全部
-
想要獲得一個類的信息必須先得到這個類的類類型查看全部
-
simpleName 不包含包名的類的名稱查看全部
-
動態加載,在運行時加載,通過類類型創建對象,如何讓多個類在一個方法內加載? 讓多個類實現同一個接口,通過接口的類類型來實現多個類的功能。查看全部
-
靜態加載類必須全部存在否則 程序無法運行。查看全部
-
new 對象是靜態加載類,在編譯時就會加載所有你可能使用到的類。查看全部
-
package com.reflect; public class ClassDemo { public static void main(String[] args) { //User的實例對象 User user=new User(); //User這個類也是一個實例對象,Class類的實例對象 /* * 第一種表示方法 * 任何一個類都有一個隱含的靜態成員變量class */ Class class1=User.class; /* * 第二種表示方法 * 已知該類的對象提供getClass()獲得 */ Class class2=user.getClass(); /* * 第三種表示方法 * */ try { Class class3=Class.forName("com.reflect.User"); } catch (ClassNotFoundException e) { e.printStackTrace(); } System.out.println(class1==class2); System.out.println(class1.equals(class2)); //通過該類的類類型創建該類的實例對象 try { User user2=(User)class1.newInstance(); user2.print(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } } class User{ public void print(){ System.out.println("User"); } }查看全部
-
獲取類類型的三種方法: Calss.forName object.getclass 獲取類的方法:類類型.getName.getMethods 包含父類的 類類型.getDeclaredMethods 本類自定義的查看全部
舉報
0/150
提交
取消