我在创建对象时遇到问题。
基本上我想通过最初的字符串来创建给定类的对象。我知道使用Class.forName(field)
有效,但不是我的情况,我会告诉你为什么在下面。我考虑过反思,但担心它会导致同样的问题。
我现在的代码是(模板是一个字符串):
int n = template.length();
String field = at.getFieldName().trim();
field = field.substring(0, field.length() - 1);
Class<?> correctClass = Class.forName(field);
UniqueEntity<correctClass> ue = new UniqueEntity<correctClass>();
我得到的错误消息是correctClass
无法解析为某种类型。
答案 0 :(得分:0)
使用Class.forName()
方法后,您获得Class
实例(变量correctClass
)调用方法getConstructor()
或getConstructors()
以获取类{{}的实例1}}。获得类Constructor
的实例后,调用方法Constructor
来获取类的实例。这是一个例子:
newInstance()
所有这些假设您的类具有默认构造函数。
答案 1 :(得分:0)
为了能够使用反射类的类型创建UniqueEntity
,您需要将类类型传递给通用辅助方法。
private static <T> UniqueEntity<T> createEntity(Class<T> clazz) {
return new UniqueEntity<T>(clazz);
}
import java.lang.reflect.Type;
public class Generic {
public static void main(String[] args) {
try {
String field = "java.lang.Integer";
UniqueEntity<?> entity = fromField(field);
System.out.println(entity);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static UniqueEntity<?> fromField(String field) throws ClassNotFoundException {
return createEntity(Class.forName(field));
}
private static <T> UniqueEntity<T> createEntity(Class<T> clazz) {
return new UniqueEntity<T>(clazz);
}
private static class UniqueEntity<T> {
private final Type type;
public UniqueEntity(Class<T> clazz) {
this.type = clazz.getGenericSuperclass();
}
@Override
public String toString() {
return "UniqueEntity [type=" + type + "]";
}
}
}