假设我有一组要扩展的类,因为它们具有我将在回调函数中使用的不同属性(即将推出):
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控件(回调函数)的内容
进一步澄清我们的团队如何使用此功能
我最终可能会用类似的东西来调用它(这必须是伪的)
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
}
}
答案 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类只代理接口,但似乎无法扩展类。