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

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

Сообщение Anonymous »

Я столкнулся с проблемой при использовании bytebuddy (библиотека 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 ... new-method

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