在class文件开头的四个字节, 存放着class文件的魔数, 这个魔数是class文件的标志,他是一个固定的值: 0XCAFEBABE 。 也就是说他是判断一个文件是不是class格式的文件的标准, 如果开头四个字节不是0XCAFEBABE, 那么就说明它不是class文件, 不能被JVM识别。
校验一下啦:
package java2.os;
import com.google.common.collect.FluentIterable;
import com.google.common.io.Files;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
/**
* Created by fhqplzj on 16-10-25 at 下午8:11.
*/
public class ByteInt {
/**
* int to byteArray
*
* @param value
* @return
*/
public static byte[] toByteArray(int value) {
return new byte[]{
(byte) (value >> 24),
(byte) (value >> 16),
(byte) (value >> 8),
(byte) value
};
}
/**
* byteArray to int
*
* @param b1
* @param b2
* @param b3
* @param b4
* @return
*/
public static int fromBytes(byte b1, byte b2, byte b3, byte b4) {
return b1 << 24 | (b2 & 0xff) << 16 | (b3 & 0xff) << 8 | (b4 & 0xff);
}
/**
* bytes数组大小至少为4
*
* @param bytes
* @return
*/
public static int fromByteArray(byte[] bytes) {
assert bytes.length >= Integer.BYTES;
return fromBytes(bytes[0], bytes[1], bytes[2], bytes[3]);
}
public static void main(String[] args) {
String path = "/home/fhqplzj/IdeaProjects/DocumentClustering";
File root = new File(path);
FluentIterable<File> files = Files.fileTreeTraverser().breadthFirstTraversal(root);
for (File file : files) {
if (file.isFile() && file.getName().endsWith(".class")) {
byte[] header = new byte[4];
try (FileInputStream inputStream = new FileInputStream(file)) {
inputStream.read(header, 0, header.length);
} catch (IOException e) {
e.printStackTrace();
}
String s = Integer.toHexString(fromByteArray(header)).toUpperCase();
System.out.println(String.format("%-100s%s", file.getName(), s));
}
}
}
}