在Android上使用Byte Buddy时出错

时间:2015-12-24 10:07:49

标签: java android byte-buddy

我正在尝试在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();

1 个答案:

答案 0 :(得分:3)

错误是因为 java.version Android 中返回 0 (请参阅系统属性here - Comparison of Java and 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

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