在Java中,我想构建一个代表复杂类型的Type
对象(来自java.lang.reflect
),即如果我有类Foo.class
和Goo.class
我想要一个{ {1}}代表Type
的对象。
我知道在Jackson例如,它是使用Foo<Goo>
类的constructParametricType()
方法完成的,但它返回org.codehaus.jackson.map.type.TypeFactory
并且我想要org.codehaus.jackson.type.JavaType
}。
答案 0 :(得分:2)
您可以使用sun.reflect.generics
API,但这可能无法移植:
class Foo<T> {}
class Goo {}
class Example {
public void parameterizedTypeExample() {
final GenericsFactory f = CoreReflectionFactory.make(
Example.class,
ClassScope.make(Example.class)
);
final ParameterizedType p = f.makeParameterizedType(
/* declaration: */ Foo.class,
/* typeArgs: */ new Type[] { Goo.class },
/* owner: */ null
);
// System.out.println(p) => "Foo<Goo>"
}
}
但是,实际上,我发现Java反射API非常不合适,特别是在处理泛型时。我基于.NET的System.Reflection
编写了an alternate API,这使得Java类型的处理更加统一。根据您的需要,您可能会发现它很有用。使用它有点简单:
Type<Foo<Goo>> fooGoo = Type.of(Foo.class)
.makeGenericType(Type.of(Goo.class));
请注意,此处Type
不 a java.reflect.Type
,但类procyon-reflection
用于表示任何类型(“引用”类,基元,类型变量) ,通配符等。)。
但是,我想我会在我的asJavaType()
类中添加一个Type
方法,该方法将返回相应的java.reflect.Type
,因为这似乎是值得的功能:)。
答案 1 :(得分:1)
如果你有一个反映声明的“Foo字段”的字段对象,你可以从java.lang.reflect.Field调用getGenericType()