我是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) 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文件加载到CompilationUnit中?例如,假设我当前项目中有一个A.java文件.我想将它加载到CompilationUnit中,然后将其传递给ASTParser.只是将它作为纯文本加载它不是一个选项,因为在这种情况下我似乎不会获得AST中的绑定信息.
java eclipse abstract-syntax-tree compilationunit eclipse-jdt
我目前的理解是JDT为我们提供了两个不同的接口和类层次结构来表示和操作Java代码:
Java Model:提供了一种表示java项目的方法.快速创建但不包含与AST类层次一样多的信息,例如,没有关于源文件中每个元素的确切位置的信息(在AST中可用)
AST:更详细的源代码表示,并提供了操作它的方法.
那是对的吗?
现在,还有一个名为I*Binding(从IBinding开始)的接口层次结构,例如IMethodBinding.例如,我们有3种不同的类型来处理方法:
从文档IMethodBinding看起来非常像AST的MethodInvocation但我没有看到明确的区别,我什么时候应该使用它们.有人可以澄清一下吗?
我有一个小问题,在 eclipse 中编译的一些 java 类与由独立 ecj 编译的类(来自相同的源代码)略有不同。如何找到 eclipse 正在使用的 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) 它曾经有效,我认为是因为 vscode 1.47.1,升级到 1.47.2 或降级到 1.46.1,同样的事情。Java 扩展和 java 调试扩展都是最新版本。
HCR 设置为自动。自动构建已启用。
尝试将 HCR 转为手动,总是得到:
找不到任何已更改的类进行热替换!
有什么建议为什么这已停止工作吗?我使用的是jdk 1.8,也尝试过java 11,同样的问题。
还想提一下,如果我更改私有方法的签名,它不会给我任何警告。它曾经告诉我代码替换失败,并询问我是否要重新启动项目。
谢谢!
我正在试验 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) 有没有办法在 Eclipse 中对匹配括号进行颜色编码?我正在寻找一种方法,让匹配的括号在嵌套时使用不同的颜色,类似于 Excel 的做法。
刚刚在 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)