java 操作字节_【Java深度历险-Java字节代码的操作】学习笔记

在infoQ上找到一篇Java深度历险(一)——Java字节代码的操纵里关于jdk1.6中可以调用Java编译器API方式,比较有兴趣,其中的例子是用java编译器API实现了算术运算的例子。执行过程如下:

定义类的字符串表示。

编译类

加载编译后的类

实例化并进行调用。

在eclipse下如果按照上述的方式进行调用,会在第三步中加载编译的类过程抛出“ClassNotFoundException”。因为默认的Eclipse的java工程编译后的文件是放在当前工程下的bin目录下。而第二步编译输出的路径是工程目录下,所以加载时会抛出类找不到的错误。

解决方案:

Java编译器API实际上是调用系统环境中的javac命令,在终端下输入javac命令,会发现javac带有n多的参数,其中有一个是-d 可以指定编译后的class文件存放目录。但在java编译器的API是如何实现的呢?

可以在JavaCompiler的getTask方法进行设置:

CompilationTask getTask(Writer out,

JavaFileManager fileManager,

DiagnosticListener super JavaFileObject> diagnosticListener,

Iterableoptions,

Iterableclasses,

Iterable extends JavaFileObject> compilationUnits);

其中的options就是指定了javac的参数。具体使用如下:

public static CompilationTask getCompilationTask(String d, String source) throws URISyntaxException {

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);

StringSourceJavaObject object = new CompilerRunTime.StringSourceJavaObject(d, source);

Iterable extends JavaFileObject> fileObjects = Arrays.asList(object);

String flag = "-d";

String outDir = System.getProperty("user.dir") + "/" + "bin";

Iterablestringdir = Arrays.asList(flag, outDir); //指定-d dir 参数

CompilationTask task = compiler.getTask(null, fileManager, null, stringdir, null, fileObjects);

return task;

}

可以看到JavaCompiler在获取Task时可以传入一定的参数,就可以指定编译的路径。

我在eclipse测试一下,测试成功。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值