发布于2026-07-09 阅读(0)
扫一扫,手机访问
Ja va 中利用 Constructor.newInstance() 调用私有构造器创建实例,有个绕不开的前提:必须先调用 setAccessible(true) 来突破访问控制。否则?IllegalAccessException 会直接抛到你脸上。
具体怎么做?第一步,通过 Class.getDeclaredConstructor(...) 拿到指定参数类型的私有构造器——注意,这里不能用 getConstructor(),它只对 public 构造器开放。拿到之后,紧接着调用 setAccessible(true) 把 Ja va 语言访问检查关掉。这一步是必需的,否则后续的 newInstance() 会因为权限不足而罢工。
getDeclaredConstructor() 能获取任意访问级别的构造器,包括 private、protected、package-privatesetAccessible(true) 是硬性要求,跳过它就等着 IllegalAccessException然后就是参数匹配的问题。构造器的参数类型必须严格对齐。举个例子,假设目标类有个 private Person(String name, int age),那你就得用 getDeclaredConstructor(String.class, int.class) 来获取,再传 newInstance("Alice", 25)。基本类型可以直接传,JVM 会自动处理包装类。要是某个参数为 null,要显式指定类型(比如 String.class),避免重载时产生歧义。
异常处理这块也跑不掉。反射创建实例可能扔出好几种异常,最好分别捕获处理:
NoSuchMethodException:构造器签名不匹配(参数类型或数量搞错了)InstantiationException:类是接口、抽象类,或者 JDK 9+ 对某些类(比如 String)的反射实例化也受限IllegalAccessException:忘记调用 setAccessible(true)InvocationTargetException:构造器内部抛了异常,可以用 getCause() 拿到原始异常
从 JDK 9 开始,Constructor.newInstance() 被标记为过时(deprecated),官方虽然没给出直接替代方法,但实际开发中大家仍然沿用 newInstance() 配合 setAccessible(true)。如果追求更现代的做法,可以考虑:
ja va.basesetAccessible 可能被禁止说到底,反射调用私有构造器虽能解决问题,但终归是绕过语言限制的“曲线救国”手段。能不用尽量不用,用的时候把异常处理和权限控制做到位,才能在复杂环境中稳稳当当。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8