gpt4 book ai didi

java - 验证编译器生成 Java 1.5 代码

转载 作者:行者123 更新时间:2023-12-03 21:47:43 25 4
gpt4 key购买 nike

我有一个 jar 文件,我使用带有 <javac target="1.5" ... /> 的 ant 文件从编译的类文件生成我想验证它是否实际生成 1.5 代码。有办法做到这一点吗?

我的 MATLAB 版本是我使用的其中一台计算机,使用的是 JRE 1.5;因此它不会运行代码,除非它与 JRE 1.5 兼容。它适用于我生成的大多数 JAR 文件,但我有一个正在运行,出现奇怪的错误:

>> s = javaObject('com.example.test.hdf5.Test1');
??? Error using ==> javaObject
No constructor with appropriate signature exists
in Java class com.example.test.hdf5.Test1

即使这是我的类,它有一个常规的旧无参数构造函数:

package com.example.test.hdf5;

import ncsa.hdf.hdf5lib.H5;
import ncsa.hdf.hdf5lib.HDF5Constants;
import ncsa.hdf.hdf5lib.exceptions.HDF5LibraryException;
import ncsa.hdf.object.FileFormat;
import ncsa.hdf.object.h5.H5File;

public class Test1 {
public Test1 () {}

public static void main(String args[])
{
Test1 test = new Test1();
if (args.length < 2)
{

}
else if ("h5file".equals(args[0]))
{
test.testH5File(args[1]);
}
else if ("h5f".equals(args[0]))
{
test.testH5F(args[1]);
}
}

public void testH5File(String filename) {
H5File file;
try
{
file = (H5File) new H5File().createFile(
filename, FileFormat.FILE_CREATE_OPEN);
file.close();
System.out.println("Success!");
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}

public void testH5F(String filename) {
try {
int id = H5.H5Fopen(filename,
HDF5Constants.H5F_ACC_RDONLY, HDF5Constants.H5P_DEFAULT);
H5.H5Fclose(id);
System.out.println("Success!");
}
catch (HDF5LibraryException e) {
throw new RuntimeException(e);
}
catch (NullPointerException e) {
throw new RuntimeException(e);
}
}
}

在同一个包 + jar 文件中生成的另一个文件工作正常:

package com.example.test.hdf5;

public class Test3 {
public Test3() {}

private int x=0;

public int foo() { return ++this.x; }
}

我想知道是否有什么东西通过导入可能不兼容 1.5 的库来搞砸编译器的 1.5 版本。


更新:我的 Test1 和 Test3 类都是 1.5(根据 javap -v,major=0,minor=49)。我添加了一个 Test2.java,它与 Test1 完全相同,但方法主体被注释掉了,因此它具有相同的签名。我用 javap -s 得到以下信息:

C:\proj\java\test-hdf5\dist>javap -s -classpath test-hdf5.jar com.example.test.hdf5.Test1
Compiled from "Test1.java"
public class com.example.test.hdf5.Test1 extends java.lang.Object{
public com.example.test.hdf5.Test1();
Signature: ()V
public static void main(java.lang.String[]);
Signature: ([Ljava/lang/String;)V
public void testH5File(java.lang.String);
Signature: (Ljava/lang/String;)V
public void testH5F(java.lang.String);
Signature: (Ljava/lang/String;)V
}


C:\proj\java\test-hdf5\dist>javap -s -classpath test-hdf5.jar com.example.test.hdf5.Test2
Compiled from "Test2.java"
public class com.example.test.hdf5.Test2 extends java.lang.Object{
public com.example.test.hdf5.Test2();
Signature: ()V
public static void main(java.lang.String[]);
Signature: ([Ljava/lang/String;)V
public void testH5File(java.lang.String);
Signature: (Ljava/lang/String;)V
public void testH5F(java.lang.String);
Signature: (Ljava/lang/String;)V
}


C:\proj\java\test-hdf5\dist>javap -s -classpath test-hdf5.jar com.example.test.hdf5.Test3
Compiled from "Test3.java"
public class com.example.test.hdf5.Test3 extends java.lang.Object{
public com.example.test.hdf5.Test3();
Signature: ()V
public int foo();
Signature: ()I
}

我猜 HDF5 库 JHDF5.jar 中确实发生了一些非常奇怪的事情,导致 MATLAB 拒绝了我的 Test1 类。

更新 2>:( >:( >:( JHDF5.jar 文件的版本为 50 (JRE1.6),所以这可能是导致我失败的原因。感谢 Matlab 不生产一条有意义的错误消息,Phooey 到 HDF5 以便使用 JRE1.6 而不是 1.5 或更早版本进行编译;我非常怀疑他们是否使用了 1.6 的任何功能。我将提交错误报告。

最佳答案

要确定类文件的 Java 字节码版本,请使用 javap -v <classname> .这将输出类似

minor version: 0
major version: 49

主要版本 49 是 Java 平台版本 1.5(48 是 1.4,50 是 1.6)

关于java - 验证编译器生成 Java 1.5 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1178332/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com