gpt4 book ai didi

java - 使用 Java doc API 从 DeclaredType/TypeMirror 获取限定类型

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:21:48 27 4
gpt4 key购买 nike

我有一个 DeclaredType一个字段,我想获得该字段的完全限定类型(原始类型?)。例如,如果字段是:

public static Optional<String> foo;

我想得到 java.util.Optional .

目前我可以通过以下方式获取包名:

env.getElementUtils().getPackageOf(declaredType.asElement());

我可以获得类型的类型参数,但是我回到了同样的问题,我最终得到了 ListTypeMirror我不知道如何获得类型的限定名称。

我注意到我可以调用 TypeMirror#toString()这将返回(对于上述)类似的东西:

java.util.Optional<java.lang.String>

我想我可以切断 < 前面的所有内容但这感觉像是黑客攻击。

作为引用,这是我获取该字段的方式:

private VariableElement getFieldWithName(DocletEnvironment environment, TypeElement classDoc, String fieldName) {
for(VariableElement e : ElementFilter.fieldsIn(environment.getElementUtils().getAllMembers(classDoc))) {
if(e.getSimpleName().toString().equals(fieldName)) {
return e;
}
}
return null;
}

TypeElement classElement = env.getElementUtils().getTypeElement(MyClass.class.getCanonicalName());
VariableElement fieldDoc = getFieldWithName(env, classElement, "foo");
DeclaredType declaredType = (DeclaredType) fieldDoc.asType();

最佳答案

我测试了这段代码,它适用于 Apache Netbeans 10 和 Jdk11。使用 ((DeclaredType) variableElement.asType()).asElement().toString():

            DeclaredType declaredType = (DeclaredType) e.asType();//e is VariableElement from the loop
fullyQualifiedName = declaredType.asElement().toString();

测试类:

class MyClass1 {
public static Optional<String> foo;
public static List<String> newList;
public static MyClass2 obj;
public Media media;
public void calculate(Double dl) {
}}

class MyClass2 extends MyClass1{
public static Color cl;
}

还有 Doclet implementation :

public class TestVarElement implements Doclet {

public void testFields(DocletEnvironment env) {
TypeElement typeElement = env.getElementUtils().getTypeElement(MyClass1.class.getCanonicalName());
System.out.println("Test for 'foo': "+getFieldWithName(env,typeElement,"foo"));
System.out.println("Test for 'newList': "+getFieldWithName(env,typeElement,"newList"));
System.out.println("Test for 'obj': "+getFieldWithName(env,typeElement,"obj"));
System.out.println("Test for 'media': "+getFieldWithName(env,typeElement,"media"));
}

private String getFieldWithName(DocletEnvironment env, TypeElement classDoc, String fieldName) {
String fullyQualifiedName = "";
for (VariableElement e : ElementFilter.fieldsIn(env.getElementUtils().getAllMembers(classDoc))) {
if (e.getSimpleName().toString().equals(fieldName)) {
DeclaredType declaredType = (DeclaredType) e.asType(); //The type of the VariableElement
fullyQualifiedName = declaredType.asElement().toString(); //Get the fqn
break;
}
}
return fullyQualifiedName;
}
@Override
public boolean run(DocletEnvironment docEnv) {
testFields(docEnv);
return true;
}

... Other Overrids

}

调试/运行程序:

     public class NewClass {
public static void main(String[] args) {
ToolProvider javadoc=ToolProvider.findFirst("javadoc").orElseThrow();
int result=javadoc.run(System.out, System.err, new String[]{"-doclet",TestVarElement.class.getName(),"C:\\Users\\Super3\\Documents\\NetBeansProjects\\Myproject\\src\\pk\\TestVarElement.java"});

//The following is for java 8 or older, the implementation is diferent where `start` method is used instead of `run`.
//Main.execute (new String[]{"-doclet",TestVarElement.class.getName(),"C:\\Users\\Super3\\Documents\\NetBeansProjects\\Myproject\\src\\pk\\TestVarElement.java"});
}
}

输出

Test for 'foo': java.util.Optional

Test for 'newList': java.util.List

Test for 'obj': pk.MyClass2

Test for 'media': javax.print.attribute.standard.Media

关于java - 使用 Java doc API 从 DeclaredType/TypeMirror 获取限定类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53982637/

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