Tag: java compiler api

最好的选择? 在编译之前编辑字节码(asm)或编辑java文件

目标 检测变量之间的比较和变量的复制 在操作发生的行附近注入代码 代码的目的:每次运行类都会使计数器增加 通用:计算执行后使用某些参数进行的比较和复制的数量 2个选项 注意:我总是有一个.java文件 1)编辑java文件 找到与正则表达式的比较并在行附近注入代码片段然后编译该类(我的应用程序使用JavaCompiler) 2)使用ASM字节码工程 还检测我想跟踪的事件的位置并将片段注入字节码然后使用(已经编译但已修改)的类 我的问题 什么是最好/最干净的方式? 有一个更好的方法吗?

如何使用通配符将JavaCompiler的类路径设置为多个.jar文件

我正在使用javax.tools JavaCompiler编译一些java代码,我试图在我的classpath中使用通配符以包含所有.jar文件,但是我失败了。 这是我的代码: String classpath = “C:\tomcat6\webapps\myapp/WEB-INF/lib/javax.ws.rs-api-2.0-m10.jar;” + “C:\\tomcat6\\webapps\\myapp/WEB-INF/lib/javax.persistence-2.1.0.jar”; Iterable options = Arrays.asList(“-d”, classesBaseDir, “-classpath”, classpath); JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, diagnostics, options, null, file); boolean result = task.call(); 上面的代码工作得很好。 但是当我试图将classpath更改为 String classpath = “C:\\tomcat6\\webapps\\myapp/WEB-INF/lib/*”; 它失败了 compiler.err.doesnt.exist|package javax.ws.rs does not exist … symbol: class GET location: class com.my.oasis.resources.TestClass 09/04/2014 14:27:09:030 | COMPILER_DIAGNOSTIC | compileResource() – […]

JavaCompiler没有正确编译文件

我正在尝试习惯JavaCompiler并尝试用它编译程序,我可以成功编译包含单个文件的程序,但是当我试图用多个文件编译项目时。 我在编译实现其他类的文件时遇到错误,并且类在哪里使用实现类中的方法。 这是我用来编译java代码的代码 private final String directoryForBin = “C:/TempBINfolder/bin”; public List doCompilation(String sourceCode, String locationOfFile) { List compile = new ArrayList(); SimpleJavaFileObject fileObject = new DynamicJavaSourceCodeObject(locationOfFile, sourceCode); JavaFileObject javaFileObjects[] = new JavaFileObject[]{fileObject}; JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); StandardJavaFileManager stdFileManager = compiler.getStandardFileManager(null, Locale.getDefault(), null); Iterable compilationUnits = Arrays.asList(javaFileObjects); // creates a Temp BIN foler on the C: […]

Java动态代码生成,支持generics

是否有任何工具可以提供Java动态代码生成并且还支持generics? 例如,Javassist是我需要的工具,但它不支持generics。 我写了一个使用Java 6 Compiler API的小型lib,但据我所知它依赖于JDK。 有没有办法指定另一个编译器? 或者只向我的应用程序提供我需要使用Java Compiler API调用的部分?

使用javac和javax.tools.JavaCompiler有什么区别?

Maven编译器插件文档说明 : Compiler Plugin用于编译项目的源代码。 从3.0开始,默认编译器是javax.tools.JavaCompiler(如果您使用的是java 1.6)并且用于编译Java源代码。 如果要使用javac强制插件,则必须配置插件选项forceJavacCompilerUse 实际上,当我们的构建中没有指定forceJavacCompilerUse会出现一些构建错误,例如当代码引用com.sun. 包(遗产,我们知道这是一个坏主意…) 这两种编译模式与maven有什么区别? 是否应该知道任何产出差异?

注释处理器 – 如何获取正在处理的类

我正在尝试编写一个自定义的Anntoation处理器。 注释处理器将在编译时处理每个类文件以检查注释,但是我如何才能获得它当前正在处理的类? 我只能在以下代码中获取类名。 public class AnnotationProcessor extends AbstractProcessor { …… @Override public boolean process(Set annotations, RoundEnvironment roundEnv) { Set rootE=roundEnv.getRootElements(); for(Element e: rootE) { if(e.getKind()==ElementKind.CLASS) { String className= e.getSimpleName().toString(); processingEnv.getMessager().printMessage( javax.tools.Diagnostic.Kind.WARNING,className, e); } } }

javax.tools是否依赖于JDK?

我想使用JavaCompiler动态创建一些类。 我找到了javax.tools包的源代码,但是没有实现; 互联网上的一些post说它取决于tools.jar ,我不确定tools.jar与JRE联系。 那么,我可以在没有安装JDK的JRE环境中运行程序吗? 另一个问题是, JavaCompiler的实现细节是什么,它是否创建了一个调用javac命令的新进程? 谢谢

我可以从编译时注释向类添加方法吗?

如果我创建一个自定义注释(例如: @SaveFuncName(“saveMe”)将添加一个名为saveMe()的方法,其中包含我的处理器生成的一些代码),javac编译器是否可以使用我的注释处理器向该类添加方法? 或者我可以只创建一个不同的类?

为什么Java在语句结尾处不显示双分号错误?

我不小心写了一个带有两个分号的java语句。 java编译器没有显示任何错误,它会运行。 码: System.out.println(“Length after delete the text is “+name.length());; 出于学习目的,我尝试在分号后添加不同的字符,并且java编译器已将编译时错误显示为令牌“)”上的语法错误,删除此标记 。 这个说法: System.out.println(“Length after delete the text is “+name.length());) 为什么java将分号和其他字符视为不同?

使用JavaCompiler和ClassLoader编译和运行用户代码

我正在为java学习编写web应用程序。 使用哪些用户可以在我的服务器上编译他们的代码+运行该代码。 使用JavaCompiler进行编译很容易: JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); DiagnosticCollector diagnostics = new DiagnosticCollector(); CompilationTask task = compiler.getTask(null, null, diagnostics, null, null, prepareFile(nazwa, content)); task.call(); List returnErrors = new ArrayList(); String tmp = new String(); for (Diagnostic diagnostic : diagnostics.getDiagnostics()) { tmp = String.valueOf(diagnostic.getLineNumber()); tmp += ” msg: ” + diagnostic.getMessage(null); returnErrors.add(tmp.replaceAll(“\n”, ” “)); } 我设法用代码加载类: JavaCompiler […]