面试题答案
一键面试代码实现思路
- 定义泛型类
ReflectionGenericClass
:使用泛型参数T
定义类,这样可以让类在实例化时指定具体的类型。 - 获取泛型实际类型信息:由于Java的泛型类型擦除,运行时无法直接获取泛型参数
T
的实际类型。因此,需要在构造函数中传入一个Class<T>
类型的参数,通过这个参数来获取实际的类型信息。 - 获取构造函数并创建实例:使用传入的
Class<T>
对象获取T
类型的构造函数,并通过构造函数创建T
类型的实例。
代码实现
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class ReflectionGenericClass<T> {
private Class<T> clazz;
// 构造函数,传入泛型类型的Class对象
public ReflectionGenericClass(Class<T> clazz) {
this.clazz = clazz;
}
// 创建泛型类型实例的方法
public T createInstance() {
try {
// 获取无参构造函数
Constructor<T> constructor = clazz.getConstructor();
// 使用构造函数创建实例
return constructor.newInstance();
} catch (NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e) {
throw new RuntimeException("Failed to create instance", e);
}
}
}
代码解释
- 定义成员变量
clazz
:用于存储传入的泛型类型的Class
对象。 - 构造函数
ReflectionGenericClass(Class<T> clazz)
:接收一个Class<T>
类型的参数,将其赋值给clazz
成员变量,以便后续使用。 createInstance
方法:- 获取无参构造函数:使用
clazz.getConstructor()
获取T
类型的无参构造函数。如果T
类型没有无参构造函数,会抛出NoSuchMethodException
。 - 创建实例:通过调用构造函数的
newInstance()
方法创建T
类型的实例。如果实例化过程中出现问题,如类是抽象类、接口或构造函数访问权限不足等,会抛出相应的异常,如InstantiationException
、IllegalAccessException
等。在捕获到异常后,通过throw new RuntimeException("Failed to create instance", e);
将异常包装并抛出,方便上层调用者处理。
- 获取无参构造函数:使用
使用示例
public class Main {
public static void main(String[] args) {
// 创建ReflectionGenericClass实例,指定泛型类型为String
ReflectionGenericClass<String> stringGenericClass = new ReflectionGenericClass<>(String.class);
// 创建String实例
String result = stringGenericClass.createInstance();
System.out.println(result);
}
}
在上述示例中,创建了ReflectionGenericClass<String>
的实例,并调用createInstance
方法创建了String
类型的实例。这里使用String
作为泛型类型,实际使用时可以替换为任何具有无参构造函数的类。