Jvm 有没有一种软更改Java版本的方法?

Jvm 有没有一种软更改Java版本的方法?,jvm,Jvm,我有一个旧的应用程序,它拒绝在未测试的Java版本上启动。不幸的是,它是一个废弃软件,所以更新的机会很小。它抱怨JVM是由Oracle而不是Sun制造的 在MS DOS时代,有一个setver命令,允许用户设置应用程序看到的操作系统版本,是否有类似于JVM上的版本?我将使用OpenJDK项目中的命令将文件分解为字节码汇编格式。 例如,helloworld如下所示(jdis NameOfClass.class>NameOfClass.j): 然后你可以用Java正常运行它 这只是一个例子 您只需找

我有一个旧的应用程序,它拒绝在未测试的Java版本上启动。不幸的是,它是一个废弃软件,所以更新的机会很小。它抱怨JVM是由Oracle而不是Sun制造的

在MS DOS时代,有一个
setver
命令,允许用户设置应用程序看到的操作系统版本,是否有类似于JVM上的版本?

我将使用OpenJDK项目中的命令将文件分解为字节码汇编格式。 例如,helloworld如下所示(
jdis NameOfClass.class>NameOfClass.j
):

然后你可以用Java正常运行它

这只是一个例子

您只需找到具有检查版本的方法的类。例如,您可以解压jar文件,例如,如果不匹配版本的消息是,例如:

“检测到错误版本:”

您只需对它进行grep(
grep-rbad.version
)即可获得该类。 在这里,您必须更改负责检查Java版本的方法

例如:

A.java:

public class A{
        static boolean hasMatchingJavaVersion() {
                return System.getProperty("java.version").matches("1.4.*");//Just Java 1.4
        }
        public static void main(String[] args) {
                if(hasMatchingJavaVersion()) {
                  System.out.println("Matches");
                } else {
                  System.out.println("Bad version");
                  System.exit(-1);
                }
        }
}

运行它:
false
(例如,在Java15上)

作为大会


super public class A
    version 59:0
{

public Method "<init>":"()V"
    stack 1 locals 1
{
        aload_0;
        invokespecial   Method java/lang/Object."<init>":"()V";
        return;
}

static Method hasMatchingJavaVersion:"()Z"
    stack 2 locals 0
{
        ldc String "java.version";
        invokestatic    Method java/lang/System.getProperty:"(Ljava/lang/String;)Ljava/lang/String;";
        ldc String "1.4.*";
        invokevirtual   Method java/lang/String.matches:"(Ljava/lang/String;)Z";
        ireturn;
}

public static Method main:"([Ljava/lang/String;)V"
    stack 2 locals 1
{
        invokestatic    Method hasMatchingJavaVersion:"()Z";
        ifeq    L17;
        getstatic   Field java/lang/System.out:"Ljava/io/PrintStream;";
        ldc String "Matches";
        invokevirtual   Method java/io/PrintStream.println:"(Ljava/lang/String;)V";
        goto    L29;
    L17:    stack_frame_type same;
        getstatic   Field java/lang/System.out:"Ljava/io/PrintStream;";
        ldc String "Bad version";
        invokevirtual   Method java/io/PrintStream.println:"(Ljava/lang/String;)V";
        iconst_m1;
        invokestatic    Method java/lang/System.exit:"(I)V";
    L29:    stack_frame_type same;
        return;
}

} // end Class A

例如,您可以将其更改为:

static Method hasMatchingJavaVersion:"()Z"
    stack 2 locals 0
{
        iconst_1;//Load true, always return true
        ireturn;
}
然后用
jasm
再次编译它

编辑:

该JVM由Oracle而不是Sun制造

我读得太多了,但它的工作方式与上面描述的相同,只是另一个系统属性和一些其他小更改

public class A{
        static boolean hasMatchingJavaVersion() {
                return System.getProperty("java.version").matches("1.4.*");//Just Java 1.4
        }
        public static void main(String[] args) {
                if(hasMatchingJavaVersion()) {
                  System.out.println("Matches");
                } else {
                  System.out.println("Bad version");
                  System.exit(-1);
                }
        }
}


super public class A
    version 59:0
{

public Method "<init>":"()V"
    stack 1 locals 1
{
        aload_0;
        invokespecial   Method java/lang/Object."<init>":"()V";
        return;
}

static Method hasMatchingJavaVersion:"()Z"
    stack 2 locals 0
{
        ldc String "java.version";
        invokestatic    Method java/lang/System.getProperty:"(Ljava/lang/String;)Ljava/lang/String;";
        ldc String "1.4.*";
        invokevirtual   Method java/lang/String.matches:"(Ljava/lang/String;)Z";
        ireturn;
}

public static Method main:"([Ljava/lang/String;)V"
    stack 2 locals 1
{
        invokestatic    Method hasMatchingJavaVersion:"()Z";
        ifeq    L17;
        getstatic   Field java/lang/System.out:"Ljava/io/PrintStream;";
        ldc String "Matches";
        invokevirtual   Method java/io/PrintStream.println:"(Ljava/lang/String;)V";
        goto    L29;
    L17:    stack_frame_type same;
        getstatic   Field java/lang/System.out:"Ljava/io/PrintStream;";
        ldc String "Bad version";
        invokevirtual   Method java/io/PrintStream.println:"(Ljava/lang/String;)V";
        iconst_m1;
        invokestatic    Method java/lang/System.exit:"(I)V";
    L29:    stack_frame_type same;
        return;
}

} // end Class A

static Method hasMatchingJavaVersion:"()Z"
    stack 2 locals 0
{
        ldc String "java.version";
        invokestatic    Method java/lang/System.getProperty:"(Ljava/lang/String;)Ljava/lang/String;";
        ldc String "1.4.*";
        invokevirtual   Method java/lang/String.matches:"(Ljava/lang/String;)Z";
        ireturn;
}
static Method hasMatchingJavaVersion:"()Z"
    stack 2 locals 0
{
        iconst_1;//Load true, always return true
        ireturn;
}