Я считаю, что 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();
Код: Выделить всё
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
3.12.1.GA
Большое спасибо!
Подробнее здесь: https://stackoverflow.com/questions/787 ... at-runtime