java - 获取 Java 类型的签名作为字符串

标签 java reflection bytecode javassist

我需要获取(作为字符串)某些 Java 类型的类型签名

例如,这是某些 ParameterizedType 的类型签名:

Lorg/mapackage/MyClass<Ljava/lang/String;>;

我需要在使用 Javassist 开发应用程序的上下文中使用它。

为了更好地解释我正在寻找的内容,我展示了方法 createGetter 的摘录,该方法使用 Javassist 为私有(private)字段生成 getter 方法。该字段的类型是参数化类型(即,它使用泛型)。

createGetter 方法接收字段类型作为第一个参数,第二个参数是字段名称,第三个参数是应添加该方法的类:

public CtMethod createGetter(Type propertyType, String propertyName, CtClass ctDeclaringClass) {
    CtMethod ctGetterMethod = ...

    if(propertyType instanceof ParameterizedType //parameterized "single" type
      || propertyType instanceof GenericArrayType) { //parameterized array
        String signature = asGenericSignature(propertyType); //MISSING PIECE OF THE PUZZLE !
        ctGetterMethod.setGenericSignature(signature);
    }   
    return ctGetterMethod;
}

例如,如果我有一个类

public class TestClass{
  private MyClass<String> myField;
}

然后在调用字段myFieldcreateGetter方法后,该类变为:

public class TestClass{
  private MyClass<String> myField;

  public MyClass<String> getMyField() {
    return MyClass<String> myField;
  }
}

生成的 getter 方法的返回类型应该与字段具有相同的通用签名(代码可以在没有具有相同字段通用签名的方法的情况下进行编译,因为对于编译器来说,只有相同的类就可以了。原因我需要它具有相同类型的通用签名(这里不解释)。

createGetter 方法的代码说明,使用 Javassist,为了设置方法的泛型类型签名,我首先需要获取 String 这样的类型签名(如果有另一个类型签名)方式请有人告诉我)。 我知道 getter 方法应该具有的确切参数化类型,因为它与字段完全相同。但我有这样的类型 ParameterizedType 的实例.

我的问题是:在给定任意 Java Type 的情况下,如何以字符串形式获取这些类型签名(包括类型参数数据) ?。

感谢您的帮助。

最佳答案

Eclipse 在内部使用 Java 源代码的描述符/签名。其中还包括可能对您有用的通用信息。接口(interface) IMethod 可能是一个很好的调查起点。

关于java - 获取 Java 类型的签名作为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12255335/

相关文章:

java - 使用 Java Hibernate 将复合主键映射到外键实体

java - 调试 VerifyError 的好工具?

java - 从 GWT 解析带有时区的日期

java - 如何在 Java 中合并两个不可变集?

c# - 如何在 C# 中从字符串创建泛型类?

c# - 如何在 C#.NET 中不同类型的对象之间进行深度复制

c# - 通过 MethodInfo 调用方法

java - 有什么理由不将 invokevirtual 和 invokeinteface 字节码指令合二为一吗?

java - 我应该查看 java 编译器生成的字节码吗?

java.lang.AbstractMethodError : org. slf4j.impl.Log4jLoggerAdapter.log(ava/lang/Object;Ljava/lang/Throwable;)V