實例.getClass();
類.class;
c.newInstance(); //獲取類對象
(1).通過反射來創建類的對象.
通過反射來創建對象有以下以下兩種方式:
1).使用Class對象的newInstance()方法來創建該Class對象對應的實例,這種方式要求該Class對象對應的類有默認構造器,
而執行 newInstance()方法實際上是利用默認構造器來創建該類的實例,所以也就需要對應類要聲明一個默認的構造器.如下面的代碼所示:
import java.util.*;
import java.io.*;
///使用Class對象創建對應類的實例: 方式1
public class ObjectPool {
///定義一個對象池,前面是對象名,後面是實際對象
private Map<String,Object> objectPool = new HashMap<>();
///根據傳入的字符串類名,創建一個對象
private Object createObject(String name) throws InstantiationException,ClassNotFoundException,IllegalAccessException
{
Class<?> clazz= Class.forName(name);
return clazz.newInstance();
}
//根據指定文件來初始化對象池
public void initPoo(String fileName) throws InstantiationException,ClassNotFoundException,IllegalAccessException
{
try( FileInputStream fis = new FileInputStream(fileName)){
Properties props = new Properties();
props.load(fis);
//每取出一對key-value對,就根據value創建一個對象
for(String name:props.stringPropertyNames()){
objectPool.put(name, createObject(props.getProperty(name)));
}
}
catch(IOException e){
e.printStackTrace();
}
}
public Object getObject(String name){
return objectPool.get(name);
}
public static void main(String[] args) throws Exception
{
ObjectPool po =new ObjectPool();
po.initPoo("/Test/obj.txt");
System.out.println(po.getObject("a"));
System.out.println(po.getObject("b"));
}
}
Class<? extends T>(class.forname())
<T>:定義一個泛型
T :定義方法返回的類型是之前定義的泛型類型
Class<? extends T> 這個是定義參數的類型爲Class,
但是這個Class必須是和之前定義的泛型有繼承關係的。?表示任意類的Class,不過後面跟了extends 表明了條件。
instanceof 和isinstance 比較的是類 而 equals和== 比較的是類對象