Как заменить доступ к статическому полю новым методом генерации?JAVA

Программисты JAVA общаются здесь
Anonymous
Как заменить доступ к статическому полю новым методом генерации?

Сообщение Anonymous »

Я столкнулся с проблемой при использовании Byte Buddy (библиотека Java-агента) для замены поля. Например, следующий пример кода:

Код: Выделить всё

public class A {
public static String foo;

public String originalMethod() {
return foo; // 'return dynamicGenerateMethod()' after replaced
}

public String dynamicGenerateMethod() {
return "bar";
}
}
Когда я использую MemberSubstitution для замены статического поля доступа A.foo новым методом генерации:

Код: Выделить всё

DynamicType.Unloaded make = new ByteBuddy()
.redefine(A.class)
.defineMethod("dynamicGenerateMethod", String.class, Opcodes.ACC_PUBLIC)
.intercept(FieldAccessor.ofField("foo"))
.visit(MemberSubstitution.relaxed()
.field(named("foo"))
.onRead()
.replaceWithMethod(named("dynamicGenerateMethod"))
.on(not(named("dynamicGenerateMethod"))))
.make();
Выдается исключение:

Код: Выделить всё

java.lang.IllegalStateException: Cannot substitute parameterless instruction with public static java.lang.String com.test.A.foo
at net.bytebuddy.asm.MemberSubstitution$Substitution$ForMethodInvocation$MethodResolver$Matching.resolve(MemberSubstitution.java:1359)
Если убрать статическое оформление foo, всё нормально.
Хочу узнать, нельзя ли заменить статические переменные? Или у меня проблемы с использованием?

Подробнее здесь: https://stackoverflow.com/questions/788 ... ate-method

Вернуться в «JAVA»