【发布时间】:2013-11-15 04:59:14
【问题描述】:
我有一个应用程序,我在其中生成基于 Java“源”类的“目标文件”。我想在源更改时重新生成目标。我决定最好的方法是获取类内容的字节[]并计算字节[]的校验和。
我正在寻找获取类的 byte[] 的最佳方法。这个 byte[] 相当于编译的 .class 文件的内容。使用 ObjectOutputStream 不 工作。下面的代码生成一个比类文件的字节内容小得多的字节[]。
// Incorrect function to calculate the byte[] contents of a Java class
public static final byte[] getClassContents(Class<?> myClass) throws IOException {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
try( ObjectOutputStream stream = new ObjectOutputStream(buffer) ) {
stream.writeObject(myClass);
}
// This byte array is much smaller than the contents of the *.class file!!!
byte[] contents = buffer.toByteArray();
return contents;
}
有没有办法让 byte[] 与 *.class 文件的内容相同?计算校验和是容易的部分,困难的部分是获取用于计算 MD5 或 CRC32 校验和的 byte[] 内容。
【问题讨论】:
-
这听起来像是你真的不应该为之滚动的东西。为什么要原始 .class 文件?
-
我不明白你为什么要检查 .class 文件的 byte[] 而不是 src 文件。您也可以尝试查看上次修改时间。
-
@Keerthi,我想计算 *.class 而不是 *.java 文件的内容,因为即使 cmets 改变,后者也会改变。我不在乎 cmets 的内容是否改变,只要实际指令改变。
-
@torquestomp,我想要原始的 *.class 文件,因为它代表了实现和签名的全部内容。我希望仅当自上次生成源后 *.class 文件的校验和发生更改时才重新生成目标文件。
-
MakeFile 概念也是一种使用的技术。试着从中得到一些想法。但它再次通过比较生成的二进制/目标文件的时间戳和其内部数据库中源文件的最后修改类型来检查源文件的任何更改。 pubs.opengroup.org/onlinepubs/9699919799/utilities/make.html
标签: java class reflection checksum