在运行时扩展类

时间:2014-10-29 07:26:41

标签: java class runtime extend

我需要创建一个自定义表UI。为了将来的灵活性,我宁愿将UIManager.getUI()末尾的调用返回的任何对象扩展到JTable.updateUI()。所以,我不知道该类被调用了什么,或者它的路径,直到运行时。

这可能,我该怎么办?我从来没有做任何与反思有关的事情,所以如果它涉及到这一点,请对我温柔:-)我在这里看过其他类似的问题,似乎没有一个我需要的,或者在可以理解的方式。对不起,如果我错过了什么: - )

编辑:我假设我需要使用的结构是这些内容(这将在我的JTable后代中出现):

@Override
public void updateUI()
{
  super.updateUI();
  ComponentUI theUI = UIManager.getUI(this)[extended in some way with an overriding paint(){....}]
  setUI((TableUI)theUI);
}

这是我缺少的方括号中的部分的语法。在我看来,有点像匿名内部类声明,或许是:

...
ComponentUI theUI = UIManager.getUI(this)
{
  public void paint(Graphics g, JComponent c)
  {
    ...
  }
}

我不是说上面存在,但有没有办法实现它?

1 个答案:

答案 0 :(得分:0)

如果这是你的意思:

您可以使用Class.forName在运行时加载类。 例: 假设我们有一个接口A,它定义了functiong foo(),其中有很多实现它的类。为所有类提供相同的构造函数很重要(没有它可以做但是逻辑会很复杂)

在运行时,我们得到了我们想要使用的类的名称和可能的路径(或者我们已经知道我们的类应该通过其他方式在哪里)。所以我们可以这样:

String class = getPath();
Class<?> toUse = Class.forName(class);
A instance = (A) toUse.getConstructors()[0].newInstance(args);
instance.foo(); //TADA
op编辑后

: 好的,你的问题现在更清楚了,我怀疑我的解决方案是你正在寻找的。您可以创建一个构成ComponentUI的类,并使用它来扩展您需要的任何内容。

像这样的事情(真的不确定它是否有帮助,因为我对整个JPanel等都不了解这个问题一开始就认为这个问题很简单):

class B { //maybe class should extend or implement something, depends on what exactly is required
       private ComponentUI c;
       //other fields

       public B(ComponentUI c) {
           this.c = c;
           //other stuff you need done
       }

       //other methods you might need
}