标签: eclipse-jdt

使用JDT获取完整的方法名称

我是eclipse插件开发的新手,我正在尝试将IMethod转换为完整方法名称的字符串表示形式.IE

my.full.package.ClassName.methodName(int param, String string)
Run Code Online (Sandbox Code Playgroud)

到目前为止,我不得不亲自推出自己的解决方案.有没有更好的办法?

private static String getMethodFullName(IMethod iMethod)
{
    String packageString = "[Default Package]";
    try {
        IPackageDeclaration[] declarations = iMethod.getCompilationUnit().getPackageDeclarations();
        if(declarations.length > 0)
        {
            packageString = declarations[0].getElementName(); 
        }           
    } catch (JavaModelException e) {
    }

    String classString = iMethod.getCompilationUnit().getElementName();
    classString = classString.replaceAll(".java", "");

    String methodString = iMethod.getElementName() + "(";
    for (String type : iMethod.getParameterTypes()) {
        methodString += type + ",";
    }
    methodString += ")";

    return packageString + "." + classString + "." + methodString;
}
Run Code Online (Sandbox Code Playgroud)

java eclipse-plugin eclipse-jdt

5
推荐指数
2
解决办法
3099
查看次数

Java从方法返回类型派生的泛型类型推断

public class TestCase {
    public static String compiles() {
        return getAction();
    }

    /*
    public static String doesntCompile1() {
        return (String) getAction();
    }

    public static String doesntCompile2() {
        return TestCase.<String> getAction();
    }
    */

    public static <T extends javax.swing.Action> T getAction() {
        return (T) null;
    }
}
Run Code Online (Sandbox Code Playgroud)

这应该被视为javac v1.6.0_22和jdt v3.7.1中的错误吗?对我来说似乎是这样,因为在其他情况下,编译器实际上发现了潜在的ClassCastException.在compiles方法中,这将在运行时抛出ClassCastException.

带来这个例子的原始代码没有在javac中编译,打印出以下异常.不幸的是,我出于某种原因提供的例程代码不会产生此错误.

type parameters of <T>T cannot be determined;
no unique maximal instance exists for type variable T with upper bounds
Run Code Online (Sandbox Code Playgroud)

java generics type-inference javac eclipse-jdt

5
推荐指数
1
解决办法
1859
查看次数

Eclipse从.java文件创建CompilationUnit

如何将.java文件加载到CompilationUnit中?例如,假设我当前项目中有一个A.java文件.我想将它加载到CompilationUnit中,然后将其传递给ASTParser.只是将它作为纯文本加载它不是一个选项,因为在这种情况下我似乎不会获得AST中的绑定信息.

java eclipse abstract-syntax-tree compilationunit eclipse-jdt

5
推荐指数
1
解决办法
4676
查看次数

I*Binding在Eclipse JDT中的作用是什么?

我目前的理解是JDT为我们提供了两个不同的接口和类层次结构来表示和操作Java代码:

  • Java Model:提供了一种表示java项目的方法.快速创建但不包含与AST类层次一样多的信息,例如,没有关于源文件中每个元素的确切位置的信息(在AST中可用)

  • AST:更详细的源代码表示,并提供了操作它的方法.

那是对的吗?

现在,还有一个名为I*Binding(从IBinding开始)的接口层次结构,例如IMethodBinding.例如,我们有3种不同的类型来处理方法:

从文档IMethodBinding看起来非常像AST的MethodInvocation但我没有看到明确的区别,我什么时候应该使用它们.有人可以澄清一下吗?

java eclipse eclipse-jdt

5
推荐指数
1
解决办法
1140
查看次数

如何在eclipse中找到ecj版本?

我有一个小问题,在 eclipse 中编译的一些 java 类与由独立 ecj 编译的类(来自相同的源代码)略有不同。如何找到 eclipse 正在使用的 ecj 版本?(我假设这就是差异所在)

java eclipse eclipse-jdt

5
推荐指数
1
解决办法
1456
查看次数

将 Eclipse 配置为使用 javac 而不是 ECJ 进行编译?

我在使用 javac 编译器编译的 maven 项目中遇到了一些与 java8 相关的代码,但在 Eclipse 中给出了编译错误(我认为 ECJ 编译器不同于 javac)。

我在 Eclipse-Luna 中导入它:Import => Maven => Existsing Maven Project

作为快速修复,有没有办法让 Eclipse 在 maven 项目中使用 javac(从而禁用 ECJ 编译器)?

编辑:添加编译器差异的最小 poc 示例。

此代码使用javac 编译,但 List 初始化在 Eclipse 中给出错误:“此表达式的目标类型必须是功能接口”

package test;

import static java.util.Arrays.asList;

import java.util.List;

public class Test01 {

    private static final List<MyInterface> items = asList(() -> "123", () -> "456");

    public void test01() {
        System.out.println("Hello");
    }

    public interface MyInterface {
        String value();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果添加类型转换,错误就会消失:

private …
Run Code Online (Sandbox Code Playgroud)

java eclipse javac eclipse-jdt java-8

5
推荐指数
0
解决办法
1409
查看次数

Java 热代码替换 (HCR) 未在 VSCode 中更新

它曾经有效,我认为是因为 vscode 1.47.1,升级到 1.47.2 或降级到 1.46.1,同样的事情。Java 扩展和 java 调试扩展都是最新版本。

HCR 设置为自动。自动构建已启用。

尝试将 HCR 转为手动,总是得到:

找不到任何已更改的类进行热替换!

有什么建议为什么这已停止工作吗?我使用的是jdk 1.8,也尝试过java 11,同样的问题。

还想提一下,如果我更改私有方法的签名,它不会给我任何警告。它曾经告诉我代码替换失败,并询问我是否要重新启动项目。

谢谢!

eclipse-jdt visual-studio-code vscode-debugger

5
推荐指数
0
解决办法
974
查看次数

带有内部枚举类的 Eclipse AST 的奇怪结果

我正在试验 eclipse jdt AST 并且遇到了一种我无法解释的奇怪行为。

这是我的示例代码:

public static void main(String[] args) {
    StringBuilder content = new StringBuilder();
    content.append("class Foo {");
    content.append("    enum Bar {");
    content.append("        VALUE;");
    content.append("        int getValue() {");
    content.append("            return 4;");
    content.append("        }");
    content.append("    }");
    content.append("    int getValue() {");
    content.append("        return 42;");
    content.append("    }");
    content.append("}");

    ASTParser parser = ASTParser.newParser(AST.JLS13);
    parser.setKind(ASTParser.K_COMPILATION_UNIT);
    parser.setSource(content.toString().toCharArray());

    CompilationUnit astNode = (CompilationUnit) parser.createAST(null);

    Visitor rtVisitor = new Visitor();
    astNode.accept(rtVisitor);

}

private static class Visitor extends ASTVisitor {

    @Override
    public boolean visit(TypeDeclaration node) {
        System.out.println(node);
        return …
Run Code Online (Sandbox Code Playgroud)

java abstract-syntax-tree eclipse-jdt

5
推荐指数
1
解决办法
75
查看次数

有没有办法在 Eclipse 中对括号进行颜色编码?

有没有办法在 Eclipse 中对匹配括号进行颜色编码?我正在寻找一种方法,让匹配的括号在嵌套时使用不同的颜色,类似于 Excel 的做法。

java eclipse eclipse-jdt

5
推荐指数
1
解决办法
65
查看次数

JDK 17:Switch 语句导致 java.lang.VerifyError:操作数堆栈上的类型错误

刚刚在 Eclipse 2021-09 上尝试了 JDK17,结果失败并显示java.lang.VerifyError,这本身并没有多大帮助。我追踪到一个 switch 语句,该语句获取从一个Map或另一个泛型类型中提取的值。如果我在 switch 语句中使用局部变量,一切都会按预期工作。

测试代码:

import java.util.HashMap;
import java.util.Map;

public class SwitchFail {
  public static void main(String[] args) {
    //doesnt work
    Map<Integer, String> stringMap = new HashMap<>();
    stringMap.put(1, "Test");
    switch(stringMap.get(1)) {
    }

    //works
    String plainString = "Test";
     switch(plainString) {
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这会引发以下错误:

Error: Unable to initialize main class SwitchFail
Caused by: java.lang.VerifyError: Bad type on operand stack
Exception Details:
  Location:
    SwitchFail.main([Ljava/lang/String;)V @33: invokevirtual
  Reason:
    Type 'java/lang/Object' (current frame, stack[0]) is …
Run Code Online (Sandbox Code Playgroud)

java switch-statement eclipse-jdt ecj java-17

5
推荐指数
1
解决办法
1936
查看次数