我有一个类,它使用XML和反射将Object返回给另一个类.

通常这些对象是外部对象的子场,但偶尔也会希望在飞翔上生成.我试过这样的东西,但没有效果.我相信这是因为Java不允许您访问private个用于反射的方法.

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方法.

推荐答案

可以通过反射调用私有方法.修改发布代码的最后一位:

Method method = object.getClass().getDeclaredMethod(methodName);
method.setAccessible(true);
Object r = method.invoke(object);

这里有几个警告.首先,getDeclaredMethod将只查找在当前Class中声明的方法,而不是从超类型继承.因此,如有必要,请向上遍历具体的类层次 struct .其次,SecurityManager可以阻止使用setAccessible方法.因此,它可能需要作为PrivilegedAction运行(使用AccessControllerSubject).

Java相关问答推荐

让两个方法来回调用有缺点吗?

编译期间错误(Java 0000)Android .Net MAUI

如何审查Java dtos中的自定义注释字段?

在Java 8之后,HashMap的最坏情况下时间复杂度仍然是O(n)而不是O(log n)?

@org.springframework.beans.factory.annotation.Autowired(required=true)-注入点有以下注释:-SpringBoot

有没有一种方法使保持活动设置专用于java.net.http.HttpClient的一个实例

将数组整体转换为链接表

Java记录的不同序列化/反序列化

将关键字与正文中的_Allowed匹配,但带有__Signing可选后缀

我无法获取我的Java Spring应用程序的Logback跟踪日志(log)输出

为什么Java Annotation接口覆盖对象类中的方法

如何从日期中截取时间并将其传递给组件?

如何将Java文档配置为在指定的项目根目录中生成?

允许同时执行两个方法,但不能同时执行这两个方法

如何在JUNIT测试中覆盖ExecutorService?

如何以编程方式保存workBench.xmi?

为什么这种递归会有这样的行为?

在单例类上获取Java锁,了解原因

H2数据库仅支持%1个结果集?

从字节数组切换到JakartaMail org.springframework.mail.javamail.JavaMailSender InputStreamResource