当前位置: 首页 > 面试题库 >

JDK 1.6中的JavaCompiler:如何将类字节直接写到byte []数组?

葛泳
2023-03-14
问题内容

因此,我最近了解了JDK 1.6中可用的新JavaCompiler
API
。这使得从运行代码直接String将a
编译为.class文件非常简单:

String className = "Foo";
String sourceCode = "...";

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

List<JavaSourceFromString> unitsToCompile = new ArrayList<JavaSourceFromString>() 
    {{ 
         add(new JavaSourceFromString(className, sourceCode)); 
    }};

StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
compiler.getTask(null, fileManager, null, null, null, unitsToCompile).call();
fileManager.close();

ByteArrayOutputStream bos = new ByteArrayOutputStream();
FileInputStream fis = new FileInputStream(className + ".class");
IOUtils.copyStream(fis, bos);

return bos.toByteArray();

您可以JavaSourceFromString从Javadoc获取源代码。

这将很sourceCode容易地编译到Foo.class当前工作目录中。

我的问题是 :是否可以直接编译为byte[]数组,并避免File完全处理I / O的麻烦?


问题答案:

也许您可以创建自己的javax.tools.JavaFileManager实现类,在该类中返回自己的实现,javax.tools.FileObject然后将其写到内存中而不是磁盘中。因此,对于javax.tools.FileObject
Writer openWriter() throws IOException方法的子类,您将返回java.io.StringWriter。所有方法都应转换为String对应的方法。



 类似资料:
  • 问题内容: 我的背景是.net,我刚接触Java。我正在为公司的Java团队做一些工作,架构师需要我实现采用InputStream(java.io)对象的方法。为了实现该方法的目的,我需要将其转换为字节数组。是否有捷径可寻? 问题答案: 最简单的方法是创建一个new ,将字节复制到其中,然后调用:

  • 我有一个可以从IronPython调用的C#函数。该函数返回一个字节数组,我希望将其转换为字符串进行显示和比较。 Python告诉我要将输入参数(out Byte[]DataOut)传递为类型“strongbox[array[Byte]]”,所以我用 如何将其转换为字符串? Traceback(最近调用最后):File“”,第1行,在TypeError:expected array[Byte],g

  • 定长字节数组(Fixed-size byte arrays) bytes1, ... ,bytes32,允许值以步长1递增。byte默认表示byte1。 运算符 比较:<=,<,==,!=,>=,>,返回值为bool类型。 位运算符:&,|,^(异或),~非 支持序号的访问,与大多数语言一样,取值范围[0, n),其中n表示长度。 成员变量 .length表示这个字节数组的长度(只读)。 动态大小

  • 问题内容: 我正在编写一个Java套接字程序来从服务器读取数据,我无法控制服务器,以下是协议的约定, 2字节:幻数 2字节:数据长度 N字节:ASCII字符串数据有效载荷 大尾数表示幻数和数据长度 例如:如果我的请求是“ command / 1 / getuserlist”,如何构造以上协议的请求匹配并将响应读回到List 我是套接字编程的新手,也不知道如何构建我的请求并读回响应。 有人可以指导我

  • 问题内容: 如何在Java中将字节数组写入文件? 问题答案: 可以使用IOUtils.write(字节[]数据,OutputStream的输出)从Apache的百科全书IO。

  • 我做了一个活动,从已安装的应用程序中选择一个应用程序,获取所选应用程序的启动意图,并将该意图传递回启动活动的用户: 启动活动的OnActivity结果: 我从Logcat中提取了字符串和内部startActivity,我得到了: String:intent{act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER]fl