Javassist меняет поведение метода во время выполненияJAVA

Программисты JAVA общаются здесь
Anonymous
Javassist меняет поведение метода во время выполнения

Сообщение Anonymous »

Я хочу изменить все тело метода во время выполнения для загруженного jar.
Я считаю, что Javassist позволяет мне добиться этого, но я столкнулся с некоторыми проблемами... p>
Вот мой текущий код:

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

    ClassPool cp = new ClassPool();
cp.appendClassPath(new LoaderClassPath(Thread.currentThread().getContextClassLoader()));
CtClass ctClass = cp.get("net.minecraft.world.item.Item");
CtMethod ctMethod = ctClass.getDeclaredMethod("q");
ctMethod.setBody("{ return 1; }");
ctClass.toClass();
Я получаю сообщение об ошибке при вызове .toClass(), вот эта ошибка:

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

java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @5e5ac7d0
at java.base/java.lang.reflect.AccessibleObject.throwInaccessibleObjectException(AccessibleObject.java:388) ~[?:?]
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:364) ~[?:?]
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:312) ~[?:?]
at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:203) ~[?:?]
at java.base/java.lang.reflect.Method.setAccessible(Method.java:197) ~[?:?]
at javassist.ClassPool.toClass2(ClassPool.java:1096) ~[?:?]
at javassist.ClassPool.toClass(ClassPool.java:1079) ~[?:?]
at javassist.ClassPool.toClass(ClassPool.java:1028) ~[?:?]
at javassist.ClassPool.toClass(ClassPool.java:986) ~[?:?]
at javassist.CtClass.toClass(CtClass.java:1079) ~[?:?]
Вот что я пробовал:
  • Понижение версии с JDK16 до JDK8. То же сообщение об ошибке.
  • Использование метода .toClass(classLoader).
  • Добавление следующих строк в pom.xml

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

org.apache.maven.plugins
maven-surefire-plugin
3.0.0


--add-opens=java.base/java.lang=ALL-UNNAMED
--add-opens=java.base/java.lang.reflect=ALL-UNNAMED



И, наконец, вот моя зависимость от Javassist

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

        
javassist
javassist
3.12.1.GA

Будем очень признательны за любую информацию/решения!
Большое спасибо!

Подробнее здесь: https://stackoverflow.com/questions/787 ... at-runtime

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