創建某類A的類類型的三種方式:
1.A.class
2.A a= new A(); a.getClass();
3.Class.ForName("類的全稱");
根據類類型得到某類A的實例化
class.newInstance();
package com.wisdomtraffic.common;
public class ClassDemo {
public static void main(String[] args) {
Foo foo1=new Foo();
//任何一個類都是Class類的實例對象,這個對象表示該類的類類型
/*//第一種表示方式:*/
Class c1 =Foo.class; //表明任何一個類都有一個隱含的靜態成員變量class
/*//第二種表示方法:通過該類的實例對象創建該類的類類型*/
Class c2=foo1.getClass();
//c1,c2表示了Foo類的類類型
System.out.println(c1==c2); //true
/*//第三種表示方式:Class.ForName()*/
Class c3=null;
try {
c3= Class.forName("com.wisdomtraffic.common.Foo");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
System.out.println(c2==c3); //true
//可以通過類的類類型創建該類的對象
try {
Foo foo2 = (Foo)c1.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
}
}
class Foo{}
動態加載類與靜態加載類
編譯時加載的類爲靜態加載類。運行時加載的類爲動態加載類
new 創建的對象時靜態加載類,編譯時就加載。若有不存在的類,在編譯時就出錯
通過動態加載類Class.ForName("類的全稱")可解決該問題
package com.wisdomtraffic.common;
public class Office {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
//動態加載類,在運行時加載
Class a=Class.forName(args[0]);
//通過類類型,創建該類對象
OfficeAble officeAble = (OfficeAble)a.newInstance();
officeAble.start();
}
}
package com.wisdomtraffic.common;
public interface OfficeAble {
public void start();
}
package com.wisdomtraffic.common;
public class Word implements OfficeAble {
public void start(){
System.out.println("word /// ");
}
}
package com.wisdomtraffic.common;
public class Excel implements OfficeAble{
@Override
public void start() {
System.out.println("Excel ///");
}
}
此時若Excel類不存在,使用Word類不會報錯
基本的數據類型及void關鍵字都存在類類型
抽出部分代碼重構方法:選中代碼,右鍵-->rafactor-->ExtractMethod
根據反射操作類中的方法
package com.wisdomtraffic.common.MyTest;
import java.lang.reflect.Method;
public class ClassDemo2 {
public static void main(String[] args) throws Exception{
A a1=new A();
Class c1 = a1.getClass();
Method method = c1.getMethod("print", int.class,int.class);
Object invoke = method.invoke(a1, 1,2);
}
}
class A{
public void print(int a,int b){
System.out.println(a+b);
}
}
通過反射來認識泛型的本質
* 反射的操作都是編譯之後的操作
* c1==c2返回true,說明編譯之後,集合的泛型是去泛型化的
* java中集合的泛型是防止錯誤輸入的,只在編譯階段有效,繞過編譯後就失效了
* 驗證:通過反射來操作,繞過編譯
ArrayList a=new ArrayList();
ArrayList<String> a1=new ArrayList<String>();
a1.add("hello");
Class c1 = a.getClass();
Class c2 = a1.getClass();
System.out.println(c1==c2); //true
/**
* 反射的操作都是編譯之後的操作
* c1==c2返回true,說明編譯之後,集合的泛型是去泛型化的
* java中集合的泛型是防止錯誤輸入的,只在編譯階段有效,繞過編譯後就失效了
* 驗證:通過反射來操作,繞過編譯
*/
Method m1 = c2.getMethod("add", Object.class);
m1.invoke(a1, 20);
System.out.println(a1.size()); //2