我正在尝试在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();
答案 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 。
希望这有助于解决您的问题。