我正在使用基于Eclipse的软件,该软件允许创建应用程序并自动提供默认用户界面。 我正在尝试修改此界面(例如更改按钮图标,前景色等...)但遗憾的是我无法修改源代码,因此我尝试通过java反射来实现。 由于像JD-GUI这样的软件,我无论如何都可以对编译好的jar文件有所了解,但我不想修改和重新编译jar。 问题是这个接口是通过自定义类构建的,这些类扩展了Swing组件,并且查看了jar文件,我发现了一些烦人的技巧。举个例子:
final class MyToggleButton extends JToggleButton{
MyToggleButton (ImageIcon defaultIcon){
super.setIcon(defaultIcon);
}
@Override
public void setIcon(Icon icon){}
}
使用这种方式构建的类,如果我在MyToggleButton的实例上调用setIcon()方法,它就不会生效,因为override方法里面没有代码(我认为)。因此,我无法在特定按钮上更改默认设置的图标。
有谁知道克服这个问题的方法? 提前感谢您的帮助。
P.S。我不是一个人,但我对反思非常熟悉。
答案 0 :(得分:1)
这是不可能的。调用超类方法并绕过类中的覆盖只能通过特殊的字节码指令(invokespecial
)来实现,该指令只能在覆盖该方法的类中使用。没有办法通过反思来执行这样的调用。
答案 1 :(得分:0)
您无法调用方法的超类版本。但是,通过反射,你可能会执行相同的逻辑。例如,通过反射,您可以将图标分配给JToggleButton
中的字段,并调用将属性更改事件分派给已注册的侦听器等的方法。
基本上,您将查看JToggleButton
的源代码(或定义方法的位置),并使用反射在其原始setIcon()
方法中重现代码。不容易,漂亮或可维护,但它会起作用。
答案 2 :(得分:0)
正如其他人所提到的,如果覆盖了超类的方法,就不可能通过反射来调用它。如果可能的话,在执行此操作之前,您应该寻找另一种解决问题的方法,例如yole's suggestion,因为这很难以阅读和维护(例如,如果{{1},它很容易意外破坏方法实现更改或setIcon()
字段更改名称)。
但是,如果您绝对想要必须,您可以执行类似的操作,根据第1710行default_icon
here的来源“模仿”方法调用
setIcon()