4

指定されたクラスの新しいインスタンスを作成し、それを返すことを目的とした関数があるとします。おそらくこのようなもの:

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

    return new classReference.getClass();

}

使用法(Employeeクラスあり):

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

どうすればこれを達成できますか?

4

4 に答える 4

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");
于 2012-09-09T18:28:22.483 に答える
2

メソッドを使用でき、Class.newInstance()メソッドの戻り型はのT代わりになりClass<T>ます。

public static <T> T forgeClass(Class<T> classReference) throws InstantiationException, IllegalAccessException {
    return classReference.newInstance();
}
于 2012-09-09T18:29:48.600 に答える
1

使用するだけnewInstance()です:

Class<?> yourClass;
return yourClass.newInstance();
于 2012-09-09T18:28:51.777 に答える
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);
}

編集:コメントで指摘されているように、引数でサブクラスを渡すと、このコードは機能しません

于 2012-09-09T18:32:15.370 に答える