在 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。
希望这能帮助您解决问题。
我正在尝试使用 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。
希望这能帮助您解决问题。