- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个 DeclaredType
一个字段,我想获得该字段的完全限定类型(原始类型?)。例如,如果字段是:
public static Optional<String> foo;
我想得到 java.util.Optional
.
目前我可以通过以下方式获取包名:
env.getElementUtils().getPackageOf(declaredType.asElement());
我可以获得类型的类型参数,但是我回到了同样的问题,我最终得到了 List
的 TypeMirror
我不知道如何获得类型的限定名称。
我注意到我可以调用 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/
在 Haskell 中,我可以导入由其名称或快捷方式名称限定的模块,如下所示: import qualified Data.List as List import qualified Data.Map
我在头文件中有以下函数声明: extern void flash(const char *message, const enum msg_type type); 基本上,它有两个参数并将相应的消息推送
我遇到了一个我似乎无法理解的小问题。 我正在我的数据库中搜索一个用户一个月内收到的评论总数,然后绘制成图表。 我遇到的问题是在我的 SQL 语句中使用 MONTHNAME 如果我使用 $this->d
根据 this answer , 常量不应该被删除,因为它们可能一开始就没有分配。但是,在某些情况下我想保护动态分配的数据。例如,在管理用户 session 时†,我想确保像当前用户名这样的数据不会被
我正在处理一个大型 C++ 项目。我有一堆在项目的子集中使用的宏,但我不想将它们导出到任何地方,以避免污染不相关的代码。 现在,我的许多文件看起来像 #include // defines MACR
谁能解释为什么代码无法编译。 template struct Base { T a; Base(const T argB) : a(argB){} }; template struct Der
我正在阅读 C++-Primer(作者:Josée Lajoie 和 Stanley B. Lippman),这时我看到了有关顶级和低级 const 的部分。在一段中,它说当复制对象时,顶级 cons
我有一大块 CSS,我想将其“作用域”到特定的 HTML block 。我正在生成一个唯一的 ID,然后将其设置在 HTML block 上,然后想用相同的 ID 包装 CSS block ,以便这些
我正在尝试为接受三个参数的函数创建一个通用接口(interface)。填写第一个参数时,第二个参数的选项应该在第一个参数的范围内。第三个参数应该在第二个参数的范围内。 我当前的代码如下所示: type
似乎 C++11 和 C++14 对待纯右值的 cv 限定不同。 C++11 坚持自 C++98 以来一直存在的“经典”方法:根据 3.10/4 “非类纯右值始终具有 cv 非限定类型”。 C++14
这个问题在这里已经有了答案: Stripping all qualifiers from a function type (1 个回答) 关闭去年。 我想编写一个模板,它接受一个指向成员函数的指针(
有时在引用同一类(或基类)的其他实例成员的实例成员中阅读代码可能会造成混淆: public void MyMethod() { Where = did + AllTheseWeirdThing
因此,在使用 constexpr 时,MSVC (Visual Studio 2012) 在尝试使用这个简单的程序(包括省略)使用 constexpr 关键字限定我的函数时给了我一个错误: const
这是我的 html(在 Twig 模板中) {{folder.name}} 我正在尝试从“data-jstree”获取“type”的值。 我试过用 var node_id = ref.get_node
当我尝试编译以下函数时出现错误。 string& foo(){ return "Hello World"; } Error: 1 IntelliSense: a reference of type
我有以下情况: 一个函数创建一个字符串数组,然后将其传递给一堆其他函数。这些其他函数不应修改外部指针指向的指针或字符串本身,因此我将它们设为常量。 最小的例子: void function(const
我希望能够限定 XHTML 文档中的 KnockOutJS 属性。 这是我想做的: My name is:
我正在浏览 Programming with Objective-C Apple 提供的文档。 我正在尝试理解以下段落,但到目前为止,无法理解。 @protocol XYZPieChartViewDa
给定两个 cv-unqualified 非数组对象类型 T1和 T2 , 可以表达 true ? std::declval() : std::declval()曾经有过 cv 限定的数组或函数类型吗?
我是一名优秀的程序员,十分优秀!