我正在尝试使用反射获取不可见类的实例,也就是包私有类。我想知道是否有办法切换修饰符以使其公开,然后使用 Class.forName
访问它。当我现在尝试这样做时,它阻止我说我做不到。不幸的是没有 setAccesible
Class
类的方法。
原文由 Josh Sobel 发布,翻译遵循 CC BY-SA 4.0 许可协议
我正在尝试使用反射获取不可见类的实例,也就是包私有类。我想知道是否有办法切换修饰符以使其公开,然后使用 Class.forName
访问它。当我现在尝试这样做时,它阻止我说我做不到。不幸的是没有 setAccesible
Class
类的方法。
原文由 Josh Sobel 发布,翻译遵循 CC BY-SA 4.0 许可协议
Class.forName
应该可以。如果该类位于 "package.access"
安全属性中的包层次结构列表中,那么您将需要以适当的权限(通常是所有权限;或者没有安全管理器)执行操作。
如果您尝试使用 Class.newInstance
,请不要。 Class.newInstance
异常处理不佳。取而代之的是获得 Constructor
并调用 newInstance
。如果没有异常跟踪,很难看出您遇到了什么问题。
与以往一样,反射的大多数(但不是所有)使用都是坏主意。
原文由 Tom Hawtin - tackline 发布,翻译遵循 CC BY-SA 3.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
嵌套类- 在其他类中定义的类(包括静态和非静态类)
内部类- 非静态嵌套类(内部类的实例需要外部类的实例存在)
非嵌套(顶级)类
根据您的问题,我们知道您要访问的构造函数不是公开的。所以你的班级可能看起来像这样(
A
班级在一些不同于我们的包中)要创建此类的实例,我们需要获取要调用的构造函数,并使其可访问。完成后,我们可以使用
Constructor#newInstance(arguments)
创建实例。嵌套类和内部类
如果您想使用
Class.forName
访问嵌套(静态和非静态)类,您需要使用语法:Outer$Nested
表示Nested
类在Outer
类中声明。嵌套类与方法非常相似,它们可以访问其外部类的所有成员(包括私有成员)。但是我们需要记住,内部类的实例存在需要其外部类的实例。通常我们通过以下方式创建它们:
所以当你看到内部类的每个实例都有一些关于它的外部类的信息时(对该外部实例的引用存储在
this$0
字段中,更多信息: What does it mean if a variable has the name “this$0 “调试 Java 时在 IntelliJ IDEA 中? )So while creating instance of
Inner
class withConstructor#newInstance()
you need to pass as first argument reference to instance ofOuter
class (to simulateouter.new Inner()
行为)。这是一个例子。
在 package1
在 package2
静态嵌套类
静态嵌套类的实例不需要外部类的实例(因为它们是静态的)。因此,在他们的情况下,我们不需要寻找以
Outer.class
作为第一个参数的构造函数。而且我们不需要将外部类的实例作为第一个参数传递。换句话说,代码将与非嵌套(顶级)类相同(也许除了您需要添加使用$
而不是.
在类名中当引用Class.forName()
中的嵌套类时,如Class.forName("some.package.Outer$Nested1$NestedNested")
)。