创建一个传递类的名称的模板函数

时间:2013-07-19 16:15:04

标签: java class templates extend

假设我有一组要扩展的类,因为它们具有我将在回调函数中使用的不同属性(即将推出):

class ExtendMe1 //
class ExtendMe2 //

我想编写一个以编程方式扩展它的新类。有没有办法做这样的事情:

ExtenderTemplate(
    <ExtendMe1>, // Class to extend
    <AClassToExtendWith>, // New class name that i'm extending for
    CallbackFunction() // A function that can be run locally inside our new class
);

让我们说ExtenderTemplate方法看起来像这样:

void ExtenderTemplate( <Ext>, <NewClass> )
{
    CreateClass( <NewClass ).Extends( <Ext> ).Run( CallbackFunction );
}

有没有办法在Java中这样做?

生成的类将以编程方式构建,但看起来像这样:

public class AClassToExtendWith extends ExtendMe1
{
    public AClassToExtendWith()
    {
        CallbackFunction();
    }
    public void CallbackFunction()
    {
        // accesses something that belongs to ExtendMe1
    }
}

上下文

我们有一组ui控件,我们必须使用自己的类进行扩展,在其中执行一些常规操作,然后实际执行某些操作来扩展ui控件(希望可以通过回调函数完成)。如果我们可以将它打包成一些模板方法,那将是非常好的,最后你只有这三个参数...你在哪个ui控件扩展,你希望这个类被调用(所以我们可以在我们的视图中调用)最后你将改变关于ui控件(回调函数)的内容

进一步澄清我们的团队如何使用此功能

  • 所以我想扩展一个别人制作的UI控件..我知道它叫做什么..
  • 我需要在我的代码中以某种方式调用它,所以我需要给它一个很好的新名称......我还需要这样做,因为我想为它写一些更多的功能。
  • 我想修改UI控件,以便它使用我的功能。

我最终可能会用类似的东西来调用它(这必须是伪的)

ExtenderTemplate( "NewUIControl", "UIControl_Table", {
    UiControlRender.text = "New stuff added by accessing the extended method";
});

否则我必须这样做:

public class NewUIControl extends UIControl_Table
{
    public void FunctionThatIsRunByFrameworkAutomatically()
    {
         // Do routine stuff that accesses UIControl_Table and makes copies of this and that

         // MODIFY THIS AND THAT WITH THE NEW STUFF I WANT IN THE UICONTROL            

         // Do  more routine stuff that belongs that accesses UIControl_Table and makes copies of this and that but passes in my modified stuff instead of the typical stuff the UI COntrol outputs
    }
}

1 个答案:

答案 0 :(得分:0)

我认为,Proxy是您正在寻找的。代理文档中的一些示例代码:

为某些界面Foo创建代理:

 InvocationHandler handler = new MyInvocationHandler(...);
 Class proxyClass = Proxy.getProxyClass(
     Foo.class.getClassLoader(), new Class[] { Foo.class });
 Foo f = (Foo) proxyClass.
     getConstructor(new Class[] { InvocationHandler.class }).
     newInstance(new Object[] { handler });

或更简单:

  Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),
                                      new Class[] { Foo.class },
                                      handler);

<强>更新

我刚才看到,Proxy类只代理接口,但似乎无法扩展类。