【问题标题】:Java Reflection. Running a external jar and referring to its classes?Java 反射。运行一个外部 jar 并引用它的类?
【发布时间】:2013-02-07 00:09:09
【问题描述】:

这段代码 sn-p 允许我在我的程序中运行一个 jar:

File f = new File("client.jar");
URLClassLoader cl = new URLClassLoader(new URL[]{f.toURI().toURL(), null});
Class<?> clazz = cl.loadClass("epicurus.Client");
Method main = clazz.getMethod("main", String[].class);
main.invoke(null, new Object[]{new String[]{}});

无论如何我可以参考该外部程序的类吗?
例如,我希望能够更改其 JFrame 的标题。

【问题讨论】:

  • 标题属性在 JFrame 的 instances 上,而不是在类上。虽然您可以使用反射检查类,但不能操作实例。
  • @SteveH。 - 嗯?当然你可以......这有点反思。 Field.set(objInstance, fieldValue) ... 你去吧,我只是操纵了一个实例。
  • @BrianRoach 你是对的——也许我应该说你不能“获得”实例。您如何知道创建了一个新的 JFrame 以及从哪里获得参考?我的假设是jar文件是未知的
  • @SteveH。 - 呃,你会......做下面答案中发布的那个人。
  • @BrianRoach Erm .. 除非 JFrame 已经实例化,否则它将不起作用。但是谢谢你的狡猾。

标签: java class reflection


【解决方案1】:

我相信你可以。我会尝试如下。

在调用 main 之后,您需要运行一个循环来访问您感兴趣的窗口(可以在单独的线程中完成)。

for(Window window : Window.getWindows()){
    if(window != null && window.isVisible() && window instanceof JFrame){
        JFrame jFrame = (JFrame)window;
    }
}

然后您可以通过反射访问 JFrame 的字段和方法(或者,如果需要,通过比较 jFrame.getName() 和一些字符串来指定您正在修改的框架是您想要的)。

假设您有兴趣修改 JTextArea 中的字体大小和样式。

Field textAreaField = jFrame.getClass().getDeclaredField("textArea");
textAreaField.setAccessible(true);

将允许您访问该字段并允许您以任何您认为合适的方式对其进行修改。

从那里你需要实际的对象。

JTextArea textArea = (JTextArea) textAreaField.get(jFrame);

Font font = textArea.getFont();
textArea.setFont(new Font(font.getFontName(), font.getStyle(), 24));

这应该是为你做的。

【讨论】:

    猜你喜欢
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 2014-09-12
    • 2014-07-12
    • 2012-08-27
    • 2013-01-10
    相关资源
    最近更新 更多