Tag: 汇编

ASM通过代码查找偏移量

我想在我使用的测试用例中找到不同方法的偏移量。 我可以找到方法开始和结束的位置,我查找操作码RETURN和ARETURN(我在方法visitInsn()中扩展一个methodVisitor的类中这样做),但是我无法找到那些在那里发生的偏移量字节码。 有任何想法吗? 为了以防万一:我正在使用ASM的核心API,我知道树API可以帮助我找到我需要的东西,但树API使一切都变得缓慢并使用内存,我买不起任何这些,所以我使用核心API

我可以使用较新的JDK编译带有ant的较旧Java版本的java,以便在编译使用较新API的代码时生成输出吗?

我想只在我的系统上安装JDK 8,并且让ant javac编译操作为java 6环境创建工作类文件。 如果我在语法上只使用符合java 6的代码,这种方式有效,但是我的代码可以访问java 8 API的方法/类,并且根据ant的编译操作仍然符合java 6。 这甚至是使用“javac”任务属性“source”和“target”设置为java 6的情况。我知道这会产生以下警告:[javac]警告:[options] bootstrap类路径未设置为同时与-source 1.6。 但这不是帮助我检测我的代码是否实际使用新引入的API元素的警告类型。 当编译的代码试图利用java 8 API引入的方法/类时,我需要编译动作以某种方式做某事。 例如:使用符合java 6的代码,如果使用JDK 8进行copmiled,我可以访问java.lang.reflect.Constructor.getParameters(),JDK 8是从Java 8引入的父类Executableinheritance的方法。 当代码在java 6 exeuction环境中运行时,执行该语句将导致抛出NoSuchMethodException,不可预测,因此也未处理。 我需要我的ant编译动作生成一些不同类型的输出(停止或警告或其他),以便我可以自动执行某些操作。 在这种情况下,我是否有与ant相关的解决方案?

在NetBeans中编译任何JavaFX项目都会返回Unsupported major.minor版本52.0

我看到了许多类似的问题 Netbeans 8.0不支持major.minor版本52.0错误 不支持的major.minor版本52.0错误(重复) 运行我编译的JAR:不支持的major.minor版本52.0 即使修复了兼容性,也无法修复不支持的major.minor版本52.0 但没有一个与我的情况相同。 无论如何,我已经尝试了他们的解决方案(相关时),他们没有帮助。 我在NetBeans 8.0.2中创建了一个JavaFX FXML应用程序,并且必须手动将JDK从1.7升级到1.8以获得我想要的function。 我相信我正在使用1.8.0_52用于JRE和JDK,该项目编译得很好。 然后我的计算机通知我Java 8的更新。现在: mc@MC-Desktop:~$ java -version java version “1.8.0_60” Java(TM) SE Runtime Environment (build 1.8.0_60-b27) Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode) mc@MC-Desktop:~$ javac -version javac 1.8.0_60 突然间,任何Java 8 FXML项目在编译时都会收到上述错误消息,甚至是NetBeans附带的标准基本JavaFX FXML Application 。 Java 7 FXML将编译,但7缺少重要function。 我已经开始指定8的新项目,我在7中开始了一个新项目,然后将其升级到8:相同的结果。 我确保源/二进制格式是JDK 8,在Sources类别中,Java Platform在项目属性的Libraries类别中设置为JDK 1.8。 我找不到其他更新设置。 […]

如何检测新值已添加到枚举中,并且不在交换机中处理

我不时要在项目的枚举类型中添加一个新值。 public enum Day { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, FILENOTFOUND //this one is new one } 我想要的是每个我没有处理新值的开关都有编译时错误 ,如下所示: switch (color) { case MONDAY: case TUESDAY: case WEDNESDAY: case THURSDAY: System.out.println(“Mondays are bad.”); break; case FRIDAY: System.out.println(“Fridays are better.”); break; case SATURDAY: case SUNDAY: System.out.println(“Weekends are best.”); break; } 有一个默认:抛出一些exception是不够好的,我希望它是编译时间。 我不认为这是可能的,但也许有人有一个巧妙的把戏…… 我认为Findbugs有一个规则可以找到那些,但我只看到了这个: Eq:为枚举定义的协变equals()方法(EQ_DONT_DEFINE_EQUALS_FOR_ENUM) […]

如何使用-XX:+ UnlockDiagnosticVMOptions -XX:CompileCommand =使用JVM HotSpot打印选项

我正在尝试使用-XX:+UnlockDiagnosticVMOptions -XX:CompileCommand=print,*MyClass.myMethod命令行,如本文所述。 它似乎可以通过open-jdk ( https://wikis.oracle.com/display/HotSpotInternals/PrintAssembly )获得。 如何在oracle JDK7和JVM HotSpot中使用这些选项(或类似的等价物)?

保留已编译的java类中的参数/参数名称

当我编译这样的东西时: public class MyClass { void myMethod(String name, String options, String query, String comment) { … } } 并将其编译为类文件,似乎参数名称丢失了。 也就是说,当其他一些Java代码引用MyClass并想要调用或覆盖myMethod ,我的IDE(当前是Eclipse)似乎从类文件中获取此方法签名: void myMethod(String arg0, String arg1, String arg2, String arg3); 我知道Eclipse(以及可能还有其他IDE)允许我提供MyClass的源或javadoc (如Bishiboosh所指出的)的链接 ,并且可以利用这一点。 但我很好奇是否有某种方法告诉javac将名称包含在类文件中,以便该类的用户可以看到参数名称,即使它们只有类文件。 课程解决方案 当我用java -g:vars编译一个类时,参数的名称包含在类文件中。 -g:vars似乎等同于Eclipse – >项目属性 – > Java编译器 – >将变量属性添加到生成的类文件中。 几位作者提出了这个解决方案,但尼克的答案终于让我相信了。 在我的机器上,Eclipse有时会使用这些信息,有时它没有,这可能是我的错或Eclipse中的错误,但不是类文件或编译的问题。 无论如何,现在我知道这些信息肯定存在。 但没有接口的解决方案 虽然这对于类很好(有点),但它不适用于接口。 对我来说,逻辑上的原因似乎是,-g:vars只提供局部变量的名称,这也是javac的文档所述。 在方法体中,它的参数与局部变量非常相似,因此它们被-g:vars覆盖。 接口方法没有实体,因此它们不能有局部变量。 我最初的问题只是要求上课,因为我不知道可能有任何不同。 类文件格式 […]