我有以下课程:
public abstract class AbstractService<PersistenceClass extends IPersistence,
RequestClass, ResponseClass> {
public String processRequest(final String aRequestAsText)
{
[...]
final RequestClass request = mapper.readValue(aRequestAsText,
RequestClass);
[...]
}
}
mapper.readValue 调用通常实现为
mapper.readValue(aRequestAsText, Request.class)
如果 RequestClass 类是通用的,我该如何编码呢?
更新1(06.09.2013):此代码似乎有效:
public class GenericTypeBindigsFinder implements IGenericTypeBindigsFinder {
@SuppressWarnings("rawtypes")
@Override
public List<Class> getGenericTypes(final Class aClass) {
final List<Class> result = new LinkedList<Class>();
final ParameterizedType gen = (ParameterizedType) aClass.getGenericSuperclass();
final Type [] types = gen.getActualTypeArguments();
for (int i = 0; i < types.length; i++) {
if (types[i] instanceof Class)
{
final Class clazz = (Class)types[i];
result.add(clazz);
}
}
return result;
}
}
您可以找到相应的单元测试here。
答案 0 :(得分:2)
尝试将object
或interface
优先传递给该方法,然后您可以使用getClass()
方法或instanceof
方法获取该类。
答案 1 :(得分:1)
因此,您希望访问AbstractService中绑定的泛型类型。你可以通过反思来做到这一点。请参阅此处的示例代码:
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
public class GenericClass extends GenericSuper<String, Integer> {
public GenericClass() {
ParameterizedType gen = (ParameterizedType) getClass().getGenericSuperclass();
TypeVariable<?> typeVars[] = getClass().getSuperclass().getTypeParameters();
Type [] types = gen.getActualTypeArguments();
for (int i = 0; i < typeVars.length; i++) {
System.out.println("Generic parameter " + typeVars[i] +
" is bound to " + types[i]);
}
}
public static void main(String[] args) {
new GenericClass();
}
}
class GenericSuper<X, Y> {};
输出是:
Generic parameter X is bound to class java.lang.String
Generic parameter Y is bound to class java.lang.Integer
您可以将types[i]
投射到Class。
有关更复杂的解决方案,请参阅getTypeArguments(...)。
答案 2 :(得分:0)
您可以查看TypeTools:
Class<?>[] typeParams = TypeResolver.resolveRawArguments(AbstractService.class, getClass());
Class<PersistenceClass> persistenceClass = (Class<PersistenceClass>)typeParams[0];
Class<RequestClass> requestClass = (Class<RequestClass>)typeParams[1];
Class<ResponseClass> responseClass = (Class<ResponseClass>)typeParams[2];