有什么办法可以调用私有方法吗?
我有一个类,它使用 XML 和反射将 Object
返回到另一个类。
通常这些对象是外部对象的子字段,但有时我想动态生成它。 我尝试过类似的事情但没有成功。 我相信这是因为 Java 不允许您访问私有方法进行反射。
Element node = outerNode.item(0);
String methodName = node.getAttribute("method");
String objectName = node.getAttribute("object");
if ("SomeObject".equals(objectName))
object = someObject;
else
object = this;
method = object.getClass().getMethod(methodName, (Class[]) null);
如果提供的方法是 private
,则会失败并出现 NoSuchMethodException
。 我可以通过将方法设置为 public 或创建另一个类来派生它来解决这个问题。
长话短说,我只是想知道是否有办法通过反射访问 private
方法。
I have a class that uses XML and reflection to return Object
s to another class.
Normally these objects are sub fields of an external object, but occasionally it's something I want to generate on the fly. I've tried something like this but to no avail. I believe that's because Java won't allow you to access private
methods for reflection.
Element node = outerNode.item(0);
String methodName = node.getAttribute("method");
String objectName = node.getAttribute("object");
if ("SomeObject".equals(objectName))
object = someObject;
else
object = this;
method = object.getClass().getMethod(methodName, (Class[]) null);
If the method provided is private
, it fails with a NoSuchMethodException
. I could solve it by making the method public
, or making another class to derive it from.
Long story short, I was just wondering if there was a way to access a private
method via reflection.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
您可以通过反射调用私有方法。 修改发布的代码的最后一点:
有一些注意事项。 首先,
getDeclaredMethod
只会查找在当前Class
中声明的方法,而不是从超类型继承的方法。 因此,如有必要,请遍历具体的类层次结构。 其次,SecurityManager
可以阻止使用setAccessible
方法。 因此,它可能需要作为PrivilegedAction
运行(使用AccessController
或Subject
)。You can invoke private method with reflection. Modifying the last bit of the posted code:
There are a couple of caveats. First,
getDeclaredMethod
will only find method declared in the currentClass
, not inherited from supertypes. So, traverse up the concrete class hierarchy if necessary. Second, aSecurityManager
can prevent use of thesetAccessible
method. So, it may need to run as aPrivilegedAction
(usingAccessController
orSubject
).使用
getDeclaredMethod()
获取私有 Method 对象,然后使用method.setAccessible()
允许实际调用它。Use
getDeclaredMethod()
to get a private Method object and then usemethod.setAccessible()
to allow to actually call it.如果该方法接受非原始数据类型,则可以使用以下方法来调用任何类的私有方法:
接受的参数是 obj、methodName 和参数。 例如,
方法 concatString 可以调用为
If the method accepts non-primitive data type then the following method can be used to invoke a private method of any class:
The Parameter accepted are obj, methodName and the parameters. For example
Method concatString can be invoked as
您可以使用Spring的ReflectionTestUtils(org.springframework.test.util.ReflectionTestUtils)
示例:如果您有一个带有私有方法的类
square(int x)
you can do this using ReflectionTestUtils of Spring (org.springframework.test.util.ReflectionTestUtils)
Example : if you have a class with a private method
square(int x)
让我提供通过反射执行受保护方法的完整代码。 它支持任何类型的参数,包括泛型、自动装箱参数和空值
方法使用 apache ClassUtils 检查自动装箱参数的兼容性
Let me provide complete code for execution protected methods via reflection. It supports any types of params including generics, autoboxed params and null values
Method uses apache ClassUtils for checking compatibility of autoboxed params
另一种变体是使用非常强大的 JOOR 库 https://github.com/jOOQ/jOOR
它允许修改任何字段(例如最终静态常量)并调用 yne 受保护的方法,而无需在继承层次结构中指定具体类
One more variant is using very powerfull JOOR library https://github.com/jOOQ/jOOR
It allows to modify any fields like final static constants and call yne protected methods without specifying concrete class in the inheritance hierarhy