如何在Java中构造类型?

时间:2014-02-26 14:01:06

标签: java reflection

在Java中,我想构建一个代表复杂类型的Type对象(来自java.lang.reflect),即如果我有类Foo.classGoo.class我想要一个{ {1}}代表Type的对象。

我知道在Jackson例如,它是使用Foo<Goo>类的constructParametricType()方法完成的,但它返回org.codehaus.jackson.map.type.TypeFactory并且我想要org.codehaus.jackson.type.JavaType }。

2 个答案:

答案 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()