2012-09-09 47 views
2

假設我有一個函數,其目的是創建任何指定類的新實例,然後返回它。也許是這樣的:創建傳遞的Class.class參數的新實例

public static <T> Class<T> forgeClass(Class<T> classReference) { 

    return new classReference.getClass(); 

} 

使用(與Employee類):

Employee foo = forgeClass(Employee.class); // new Employee instance 

我怎樣才能做到這一點?

+0

公平警告:在任何一般情況下都不一定會有解決辦法。有些類是故意設計的,所以它們不能被實例化。有些類是故意設計的,所以它們只能被實例化一次。你可能會打破這個階級的假設,並搞砸它的邏輯。 –

回答

4

關鍵是要用Class.newInstance;

public static <T> T forge(final Class<T> type) 
    throws InstantiationException, IllegalAccessException { 
    return type.newInstance(); 
} 

使用方法如下...

final Employee employee = forge(Employee.class); 

如果你想使用更復雜的初始化程序,例如Employee(String name),您應該使用Class.getConstructor,然後是Constructor.newInstance

final Constructor ctor = Employee.class.getConstructor(String.class); 
final Employee employee = ctor.newInstance("Steve"); 
1

只需使用newInstance()

Class<?> yourClass; 
return yourClass.newInstance(); 
2

您可以使用Class.newInstance()方法和你的方法的返回類型應該是T而不是Class<T>

public static <T> T forgeClass(Class<T> classReference) throws InstantiationException, IllegalAccessException { 
    return classReference.newInstance(); 
} 
+0

誰投了票請留意解釋。這將有助於我改進我的答案。 –

0

Class.newInstance()正是你所需要的:

public static <T> T forgeClass(Class<T> classReference) throws InstantiationException, IllegalAccessException { 
    return classReference.newInstance(); 
} 

如果你想傳遞參數給你必須使用java.lang.reflect.Constructor<T>構造:

public static <T> T forgeClass(Class<T> classReference, Object... constructorArguments) 
     throws InstantiationException, IllegalAccessException, SecurityException, 
     NoSuchMethodException, IllegalArgumentException, InvocationTargetException { 
    Class<?>[] argumentTypes = new Class<?>[constructorArguments.length]; 
    for (int i = 0; i < constructorArguments.length; i++) 
     argumentTypes[i] = constructorArguments[i].getClass(); 
    Constructor<T> ctor = classReference.getConstructor(argumentTypes); 
    return ctor.newInstance(constructorArguments); 
} 

編輯:作爲中指出如果您在參數中傳遞子類,則此代碼不起作用

+0

如果你有'class Bar extends Foo {}'和一個需要'Foo'的構造函數,但是你通過'Bar',會發生什麼?我會給你一個提示:你的代碼不會工作。期待'NoSuchMethodException'。你在做什麼是不夠的。你需要檢查['Class.isAssignableFrom'](http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#isAssignableFrom(java.lang.Class))或[' Class.isInstance'](http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#isInstance(java.lang.Object中))。 – oldrinb

相關問題