6

我正在尝试在 Android 中使用Byte Buddy库,但出现错误:

java.lang.IllegalStateException:此 JVM 的版本字符串似乎无效:0

我还没有编码,只是:

ByteBuddy test = new ByteBuddy();

在我的 App.java

我已经导入:

<dependency>
    <groupId>net.bytebuddy</groupId>
    <artifactId>byte-buddy</artifactId>
    <version>0.7.7</version>
</dependency>

但它没有用,我尝试过:

<dependency>
    <groupId>net.bytebuddy</groupId>
    <artifactId>byte-buddy-android</artifactId>
    <version>0.7.7</version>
</dependency>

但我仍然得到同样的错误。

编辑

我在初始化 ByteBuddy 之前放了这一行:

  System.setProperty("java.version", "1.7.0_51");

但现在我得到了另一个错误:

原因:java.lang.UnsupportedOperationException:无法加载此类文件。

对于此代码:

Class<?> dynamicType = new ByteBuddy(ClassFileVersion.JAVA_V6)
            .subclass(Object.class)
            .method(ElementMatchers.named("toString"))
            .intercept(FixedValue.value("Hello World!"))
            .make()
            .load(getClass().getClassLoader(), AndroidClassLoadingStrategy.Default.WRAPPER)
            .getLoaded();
4

1 回答 1

3

该错误是因为java.versionAndroid中返回0(请参阅此处的系统属性部分- Java 和 Android API 的比较

此外,如果您观察ByteBuddy ClassFileVersion

forCurrentJavaVersion():此方法检查versionString应该返回任何有效的 Java/JDK 版本,否则它

throws IllegalStateException("This JVM's version string does not seem to be valid: " + versionString);

& 因为java.version返回0,所以它抛出IllegalStateException

尝试记录此值:

String versionString = System.getProperty(JAVA_VERSION_PROPERTY);
Log.d(TAG, versionString);//retruns 0 here

因此这个问题的解决方法是添加

 System.setProperty(JAVA_VERSION_PROPERTY, "1.7.0_79");//add your jdk version here

打电话之前

ByteBuddy test = new ByteBuddy();

其中JAVA_VERSION_PROPERTY声明为:

 private static final String JAVA_VERSION_PROPERTY = "java.version";

使用的依赖项还有:

<dependency>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy</artifactId>
<version>0.7.7</version>
</dependency>

否则,如果您使用的是工作室,您可以添加

compile 'net.bytebuddy:byte-buddy:0.7.7'

到您的应用程序build.gradle

希望这将有助于解决您的问题。

于 2015-12-24T12:28:02.437 回答