在 Android 上使用 Byte Buddy 时出错

Error using Byte Buddy on Android

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

java.lang.IllegalStateException: This JVM's version string does not seem to be valid: 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");

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

Caused by: java.lang.UnsupportedOperationException: can't load this type of class file.

对于此代码:

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();

错误是因为 java.version returns 0 in Android(参见系统属性部分 here - Comparison of Java and Android API

此外,如果您观察 ByteBuddy ClassFileVersion

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

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

& 因为 java.version 正在 returning 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

希望这能帮助您解决问题。