gpt4 book ai didi

java - 如何检索参数化类的类

转载 作者:搜寻专家 更新时间:2023-10-31 19:36:44 24 4
gpt4 key购买 nike

考虑以下代码:

public class Context {
private final Class<?> clazz;
private final String resource;
private final com.thirdparty.Context context;

public Context(final String resource, final Class<?> clazz) {
this.clazz = clazz;
this.resource = resource;
this.context = com.thirdparty.Context.newInstance(this.clazz);
}

public String marshall(final Object element) {
return this.context.marshall(element);
}

public Object unmarshall(final String element) {
return this.context.unmarshall(element);
}
}
Context context = new Context("request.xsd", Request.class);

// Marshall
Request request = new Request();
String xml = context.marshall(request);

// Unmarshall
Request roundTrip = Request.cast(context.unmarshall(xml));

我正在尝试用 Context 类的泛型版本替换它:

public class Context<T> {
private final Class<T> clazz;
private final String resource;
private final com.thirdparty.Context context;

public Context(final String resource) {
this.clazz = initHere(); // <== HOW ??
this.resource = resource;
this.context = com.thirdparty.Context.newInstance(this.clazz);
}

public String marshall(final T element) {
return this.context.marshall(element);
}

public T unmarshall(final String element) {
return this.clazz.cast(this.context.unmarshall(element));
}
}
Context<Request> context = new Context<>("request.xsd");

// Marshall
Request request = new Request();
String xml = context.marshall(request);

// Unmarshall
Request roundTrip = context.unmarshall(xml);

因此我没有将 .class 作为参数传递给构造函数,unmarshall 方法会自动转换返回对象。

我需要知道要传递给 newInstance() 方法并调用 cast() 方法的 T 类。即 T.class 或 T.getClass()。

在我的示例中,我试图在构造函数期间初始化 clazz 成员,以便我可以在两个位置使用它。

我尝试了以下方法:

this.clazz = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];

但是 getClass().getGenericSuperclass() 返回一个无法转换为 ParameterizedType 的对象。我不能使用任何第三方反射库,我需要坚持 Jdk 内部的标准机制。

最佳答案

你不能那样做。在您的情况下,通用类型 T 链接到您的实例。反射数据绑定(bind)到类,你的类没有定义类型 T。

您尝试使用的代码只有在您定义了一个设置了 T 的类时才有效。

public class RequestContext extends Context<Request> {}

如果您使用此类的实例,那么您的代码应该可以正常工作。

关于java - 如何检索参数化类的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48228512/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com