Java泛型和反射總結


A a = (A)Class.forName(“pacage.A”).newInstance();

這和你 A a = new A(); 是一樣的效果。

String className = “Example”;
class c = Class.forName(className);

 

1、如果你知道一個實例,那么你可以通過實例的“getClass()”方法獲得該對象的類型類;/

2、如果你知道一個類型,那么你可以使用“.class”的方法獲得該類型的類型類。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
             //通過泛型新建對象。Class.forName()和A.class.h
//            Class<Son> a = Son.class;
try {
             Class a = Class.forName( "com.hao.class14.Son" );} catch (Exception e){
}
             System.out.println( "do=" +a.getName());
             //創建新的對象。
             Son b= (Son) a.newInstance();需要默認的構造方法,即先調用無參構造方法
Father b=  a.newInstance();
             if (b  instanceof  Son){ //向下轉型
                 Son son = (Son)b;
             }
             b.do1();
             //創建父類對象
             Class<?  super  Son> c2 = a.getSuperclass(); //優於普通的Class
             ((Father)c2.newInstance()).do1();
             //class文件反射查詢類的參數。
             Method[] ee = a.getDeclaredMethods();

出現的時期不同:

Class.forName()在運行時(類地址為字符串)加載(先找到class中的類):加載類,初始化靜態方法。

        使用Class類的中靜態forName()方法獲得與字符串對應的Class對象

        運行期加載需要加上try。。。catch語句。

類字面常量Class.class和getClass()是在編譯時加載類.不初始化,調用靜態或非靜態域時初始化。

1、.class用於類名,getClass()是一個final native的方法,因此用於類實例

2、.class在編譯期間就確定了一個類的java.lang.Class對象;

3、.getClass()方法在運行期間確定一個類實例的java.lang.Class對象

    調用Object類的getClass()方法來得到Class對象

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//class文件反射查詢類的方法,使用invoke調用。
             Method[] ee = a.getDeclaredMethods(); //該方法是獲取本類中的所有方法,包括私有的(private、protected、默認以及public)的方法
             Method[] ee1 = a.getMethods(); //該方法是獲取本類以及父類或者父接口中所有的公共方法(public修飾符修飾的)
             String [] names ={ "tom" , "tim" , "allen" , "alice" };
             try  {
                 Method m3 = ee[ 3 ];
                 m3.invoke(a.newInstance(), null );
                 Method m1 = a.getMethod( "do5" ,String. class );
                 for (String name:names)
                     m1.invoke(a.newInstance(),name);
             }  catch  (Exception e) {
                 e.printStackTrace();
             }
 
   Method echoMethod = classType.getMethod( "echo" ,
     new  Class[] { String.class });
   result = echoMethod.invoke(invokertester,  new  Object[] { "hello" });
   System.out.println(result);

泛型機制:

這種是jdk1.5引入的泛型機制,沒有T這種類型,T是根據你輸入的來動態匹配。加入你集合放入的String類型,那么你就可以使用List<String>,然后代碼中所有出現T的地方都用String代替就可以了 ,放入的是Object類型,那么你就用List<Object>,

靜態資源不認識泛型。

泛型三種:
          [1]ArrayList<T> al=new ArrayList<T>();指定集合元素只能是T類型
          [2]ArrayList<?> al=new ArrayList<?>();集合元素可以是任意類型,這種沒有意義,一般是方法中,只是為了說明用法
          [3]ArrayList<? extends E> al=new ArrayList<? extends E>();
            泛型的限定:
               ? extends E:接收E類型或者E的子類型。
               ?super E:接收E類型或者E的父類型。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM