-
編譯 運行查看全部
-
靜態加載,在編譯時刻就要加載所有的類查看全部
-
動態加載 不需重新編譯、 當有100個類時,有一個不能加載時,其它類需要運行。功能性的類,需要用到動態加載類查看全部
-
通過反射了解集合泛型的本質 ArrayList list = new ArrayList(); ArrayList<String> list1 = new ArrayList<String>(); list1.add("hello"); Class c1 = list.getClass(); Class c2 = list1.getClass(); //c1 == c2 為true //反射的操作都是編譯之后的操作 //c1 == c2 結果返回true說明編譯之后的集合的泛型是去泛型化的 Java中集合的泛型,是防止錯誤輸入的,只在編譯階段有效,繞過編譯就無效了 //驗證:通過方法的反射來操作,繞過編譯 Method m = c2.getMethod("add",Object.class); m.invoke(list1,20);//繞過了泛型 區分編譯和運行 所有反射的操作都是要繞過編譯直接進入運行的查看全部
-
方法的反射 public class MethodDemo1{ public static void main(String[] args){ //獲取一個方法就是獲取類的信息,獲取類的信息首先就要獲取類的類類型 A a1 = new A(); Class c = a1.getClass(); //獲取方法名稱和參數列表來決定 getMethod獲取的是public的方法 //getDelcaredMethod自己聲明的方法 //Method m = c.getMethod("print",new Class[]{int.Class,int.Class}); Method m = c.getMethod("print",int.Class,intClass); //方法的反射操作 用m對象來進行方法的調用和a1.print調用效果一樣 //方法如果沒有返回值返回null,有返回值返回具體的返回值 Object o = m.invoke(a1,new Object[]{10,20}); } } class A{ public void print(int a,int b){ System.out.println(a+b); } public void print(String a,String b){ } }查看全部
-
java-reflect專題查看全部
-
Class c = obj.getClass(); //構造函數也是對象 java.lang.Constructor中封裝了構造函數的信息 getConstructors獲取所有的public的構造函數 getDeclaredConstructors()獲取所有構造函數 Constuctor[] cs = c.getDeclaredConstructors();查看全部
-
成員變量也是對象 java.lang.reflect.Field Field類封裝類關于成員變量的操作 getFileds()方法獲取的是所有的public的成員變量的信息 getDecaredFields獲取該類自己聲明的成員變量的信息 //Field[] fs = c.getFields(); //Field[] fs = c.getDecaredFields(); for(Field field : fs){ Class fieldType = fs.getType(); String fieldname = field.getName(); }查看全部
-
基本的數據類型對應的類類型 void的關鍵字都存在類類型 Class c1 = int.class//int 數據類型的類類型 Class c2 = String .class;// String 類的類類型,String類的字節碼 Class c3 = double.class; Class c4 = Double.class; Class c5 = void.class; Class類的基本操作 public class Classdemo{ } public class ClassUtil{ public static void printClassMessage(Object obj){ //獲取類的信息,首先獲取類的類類型 Class c = obj.getClass();//傳遞的是哪個子類的對象,c就是該類的類類型 //獲取類的名稱 打印(c.getname()); //Method類是方法對象 一個成員方法就是一個Method對象 //getMethods()方法獲取的是所有public的方法,包括父類繼承而來的 //getDeclaredMethods()獲取所有該類生命的方法,不問訪問權限 Method[] ms = c.getMethods();// for(int i=0;i<ms.length;i++){ //得到返回值類型的類類型 Class returnType = ms[i].getReturnType(); 打印(returnType.getName()); // 得到方法的名稱 打印(ms[i].getName()) //獲取參數類型--》 得到的是參數列表的類型的類類型 Class[] paramTypes = ms[i].getParameterTypes(); for(Class class1:paramTypes){ print(class1.getName()); } } } }查看全部
-
動態加載類 Class.forName("類的全稱") 不僅表示了類的類類型,還代表類動態加載類 //new 創建對象 是靜態加載類 ,在編譯時刻就需要加載所有的可能使用到的類 //通過動態加載類可以解決該問題 class office{ main方法{ try{ //動態加載,在運行時刻加載類 Class c = Class.forName("packagename.Classname"); //通過類類型,創建該類對象 OfficeAble e = (OfficeAble)c.newsInstance(); e.start(); }catch(...){ } } }查看全部
-
java.lang.Class 的構造對象是私有的只能由虛擬機來調用查看全部
-
可以通過c1 c2 c3 來構造Foo類的對象實例 Foo foo2 = (Foo)c1.newInstance();查看全部
-
所有的類都是java.lang.Class的實例對象 class Foo{ } Foo foo = new Foo() Class c1 = Foo.class; Class c2 = foo.getClass(); Class c3 = Class.forName("packagename.Foo"); c1 or c2 or c3 都是Foo的類類型查看全部
-
靜態成員和基本數據類型都不是面相對象的查看全部
-
Class類查看全部
舉報
0/150
提交
取消