Tag: 编译器构造

Java“空白的最终字段可能尚未初始化”Anonymous Interface vs Lambda Expression

我最近遇到了错误消息“空白的最终字段obj可能尚未初始化”。 通常情况下,如果您尝试引用可能尚未分配给值的字段。 示例类: public class Foo { private final Object obj; public Foo() { obj.toString(); // error (1) obj = new Object(); obj.toString(); // just fine (2) } } 我用Eclipse。 在第(1)我得到错误,在第(2)一切正常。 到目前为止这是有道理的。 接下来,我尝试在构造函数内创建的匿名接口中访问obj 。 public class Foo { private Object obj; public Foo() { Runnable run = new Runnable() { public void run() { obj.toString(); […]

使用自定义类加载器中的javax.tools.ToolProvider?

似乎不可能使用Ant或Webstart所需的自定义类加载器中的javax.tools.ToolProvider : http ://bugs.sun.com/view_bug.do?video_id = 6548428 javax.tools.ToolProvider.getSystemJavaCompiler()将javax.tools.JavaCompiler加载到URLClassLoader中,其父级是系统类加载器。 API似乎不允许用户指定父类加载器。 如何从自定义类加载器中使用javax.tools.JavaCompiler ? 例如: Ant加载MyParserTask MyParserTask解析Java源代码 AntClassLoader由委托给系统类加载器的AntClassLoader加载 javax.tools.JavaCompiler由URLClassLoader加载,代理到系统类加载器 稍后, MyParserTask调用: javax.tools.CompilationTask task = compiler.getTask(…); com.sun.source.util.JavacTask javacTask = (com.sun.source.util.JavacTask) task; javacTask.parse().next().accept(visitor, unused); // parsing happens here 看到这两个类如何驻留在不同的类加载器上, JavacTask没有办法在不获取ClassCastException错误的情况下与JavacTask进行交互。 有任何想法吗?

使用带注释的方法时使java编译器发出警告(如@deprecated)

假设我定义了一个名为@Unsafe的自定义注释。 我想提供一个注释处理器,它将检测对使用@Unsafe注释的方法的引用并打印警告。 例如,鉴于此代码…… public class Foo { @Unsafe public void doSomething() { … } } public class Bar { public static void main(String[] args) { new Foo().doSomething(); } } …我希望编译器打印如下: WARN > Bar.java, line 3 : Call to Unsafe API – Foo.doSomething() 它在精神上与@Deprecated非常相似,但是我的注释是在传达不同的东西,所以我不能直接使用@Deprecated 。 有没有办法用注释处理器实现这一目标? 注释处理器API似乎更关注应用注释的实体(在我的示例中为Foo.java ),而不是引用注释成员的实体。 此问题提供了一种使用ASM将其实现为单独构建步骤的技术。 但我想知道我是否可以通过javac和注释处理以更自然的方式完成它?

编译器优化:Java字节码

我目前正在编写一个针对Java字节码的玩具编译器。 我想知道在编写.class文件之前是否存在可以在发出的字节码中进行的各种简单窥孔优化的某种目录,可能是摘要。 我实际上知道一些具有此function的库,但我想自己实现它。

如何将类文件夹添加到Eclipse中?

Eclipse设置为编译到’bin’的构建目录。 我有一个包含各种Java .class文件(预编译)的文件夹结构,我想在编译时将其复制到文件夹’bin’中。 我如何告诉Eclipse自动执行此操作?

插入Java编译器

我有一个后编译步骤来操作生成的类的Java字节码。 我想让图书馆消费者尽可能轻松地生活,所以我正在研究如何使这个过程自动化,并且(如果可能的话)编译器不可知。 Annotation Processing API提供了许多所需的function(自动服务发现; Eclipse支持)。 不幸的是,这是针对代码生成器, 并不支持操作现有的文物 : 该工具的初始输入被认为是由第0轮创建的; 因此,尝试创建与其中一个输入相对应的源文件或类文件将导致FilerException。 API推荐的Decorator模式不是一个选项。 我可以看到如何使用运行时代理/检测执行该步骤,但这是一个比手动构建步骤更糟糕的选择,因为它需要任何人甚至可以通过API外围触摸来以非显而易见的方式配置其JVM。 有没有办法插入或包装javac调用的编译器工具 ? 有没有人成功地颠覆了注释处理器来操纵字节码,无论文档说什么?

如何在ECLIPSE中调试.class文件?

我正在使用Eclipse 3.5,并将src.zip附加到Eclipse中的全局设置。 Windows – >首选项 – > Java – >已安装的JRE – > rt.jar – 源附件 – ….. / jdk / src.zip 我成功地介入了java核心库.class文件并查看了源代码。 我构建了一个使用LinkedList的类,我在LinkedList类中设置了一个断点。 当我调试源代码中的断点(我的项目)工作正常但是当我需要进入java核心库.classes时,我在Eclipse中遇到以下错误 由于缺少行号属性,无法在java.util.LinkedList中安装断点。 修改编译器选项以生成行号属性。 我检查了首选项中的编译器设置,发现所有选项都选中了。 如果有人可以帮我解决这个问题,那就太好了。 提前致谢。

具有相同方法签名的两个接口在Java类中实现

我有两个Java接口和一个实现类。 (我已经使用Eclipse直接运行程序,并且我没有尝试通过从命令行显式编译来检查任何编译器警告等。) 为什么他们没有问题? 为什么Java允许这样做,即使它满足两个接口的“契约”但是在实现类时产生歧义? 更新了示例。 public interface CassettePlayer { void play(); } public interface DVDPlayer { void play(); } public class CarPlayer implements CassettePlayer,DVDPlayer{ @Override public void play() { System.out.println(“This plays DVD, screw you Cassette !”); } public static void main(String args[]) { CarPlayer cp = new CarPlayer(); cp.play(); CassettePlayer firstInterface = new CarPlayer(); firstInterface.play(); […]

从字符串编译Java源代码?

有没有办法让正在运行的Java程序编译Java源代码(作为字符串传递)? Class newClass = Compiler.compile (“class ABC { void xyz {etc. etc. } }”); 理想情况下,传入源代码引用的任何类都将由程序的类加载器解析。 这样的事情存在吗?

javac优化标志

我最近在C中编写了很多代码,现在正在转向Java。 我目前正在实现一个大型数据结构,并且想知道在调用Java编译器时是否有任何优化标志,以便提高gcc中的性能。 我习惯了: gcc -O3 -NDEBUG MyProgram.c javac有一个类似的命令吗? 我正在使用JDK并运行Ubuntu 10.04。