查看单个帖子
旧 2019-12-10, 16:49   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 验证编译器产生Java 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),所以这可能是导致我迷失的原因。Phooey对于Matlab没有产生有意义的错误消息,而Phooey对于HDF5对于使用JRE1.6而不是1.5或更早的版本进行编译;我非常怀疑它们是否使用了1.6的任何功能,我将提交一个错误报告。


回答:
要确定类文件的Java字节码版本,请使用javap -v 。这将输出类似

minor version: 0 major version: 49 主要版本49是Java平台版本1.5(48是1.4,50是1.6)



更多&回答...
poster 当前离线   回复时引用此帖