首页
社区
课程
招聘
eclipse下使用javassist遇到反射问题
发表于: 2023-6-17 01:18 7251

eclipse下使用javassist遇到反射问题

2023-6-17 01:18
7251

本人第一次使用javassist,请大家多多指教。
当前环境

  • eclipse 2023-06 RC1(在官网下的最新版)
  • javassist-3.28.0-GA
  • JDK SE-17

测试代码
来源于【Javassist】快速入门系列01 使用Javassist实现Hello World

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package helloworld;
import java.lang.reflect.*;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.CtNewMethod;
 
public class test {
    public static void main(String[] args)
    {   
            System.out.println("hello world");
        try
        {
            ClassPool pool = ClassPool.getDefault();
            CtClass ctclass = pool.makeClass("com.hello");
            CtMethod ctmethod = CtNewMethod.make("public static void main(String[] args){System.out.println(\"hello world\");}", ctclass);
            ctclass.addMethod(ctmethod);
            ctclass.writeFile();
 
            Class<?> helloclass = ctclass.toClass();
            Object hello =  helloclass.getDeclaredConstructor().newInstance();
            Method main = helloclass.getDeclaredMethod("main", String[].class);
            main.invoke(hello, (Object)new String[0]);
        }catch (Exception e) {
            e.printStackTrace();
        }
 
    }
}

出错信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to module org.javassist
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354)
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
    at java.base/java.lang.reflect.Method.checkCanSetAccessible(Method.java:199)
    at java.base/java.lang.reflect.Method.setAccessible(Method.java:193)
    at org.javassist@3.28.0-GA/javassist.util.proxy.SecurityActions.setAccessible(SecurityActions.java:159)
    at org.javassist@3.28.0-GA/javassist.util.proxy.DefineClassHelper$JavaOther.defineClass(DefineClassHelper.java:213)
    at org.javassist@3.28.0-GA/javassist.util.proxy.DefineClassHelper$Java11.defineClass(DefineClassHelper.java:52)
    at org.javassist@3.28.0-GA/javassist.util.proxy.DefineClassHelper.toClass(DefineClassHelper.java:260)
    at org.javassist@3.28.0-GA/javassist.ClassPool.toClass(ClassPool.java:1240)
    at org.javassist@3.28.0-GA/javassist.ClassPool.toClass(ClassPool.java:1098)
    at org.javassist@3.28.0-GA/javassist.ClassPool.toClass(ClassPool.java:1056)
    at org.javassist@3.28.0-GA/javassist.CtClass.toClass(CtClass.java:1298)
    at helloworld/helloworld.test.main(test.java:20)

根据网上的说法,已经在VM arguments添加--add-opens java.base/java.lang=ALL-UNNAMED,但是并没有解决问题,仍然报同样的错误。

目前毫无头绪,希望有用过javassist的大佬说一下可能存在的问题。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 1947
活跃值: (693)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
pool.makeClass这个你写的和人家不一样啊,原文中的是 target.classes.basic.domain.Hello,其中 target.classes是maven编译的默认输出目录。
2023-6-22 08:43
0
游客
登录 | 注册 方可回帖
返回
//