Java动态修改类(添加新方法)

时间:2014-12-25 17:41:57

标签: java

有没有办法在Java中修改类实例?例如,我想提供自定义回调方法。

如何为类的每个实例提供单独的方法/上下文/范围?

在javascript中,很容易修改现有的类。将anonymous函数作为回调传递给任何方法也很容易。有了它的背景和范围。

或者,如果我需要不同的回调,我是否必须为每个请求扩展自定义类?

3 个答案:

答案 0 :(得分:5)

您可以在实例化中执行此操作,如:

Whatever w = new Whatever("Something") {
    public void onWhateverDoThis() {
        //...
    }
};

所以我个人最近使用的是模态的回调方法:

ModalManager.show(new Modal("Title", "Text") {
    public void onDismiss() {
        //Do something on dismiss
    }

    public void onConfirm() {
        //Do something on confirm
    }
});

答案 1 :(得分:1)

Java和Javascript是非常不同的语言。如果您尝试应用一种在另一种中起作用的编程范例,您会非常沮丧。我一开始对Javascript感到非常沮丧,来自Java,直到我理解动态和静态语言之间的根本区别。

在这种特殊情况下,我不认为每次需要使用不同的回调时扩展您的类是个好主意,因为这会导致大量的子类。如果您需要大量仅在特定方面有所不同的对象,那么拥有代表该特定方面的类或接口会不会更好?

一种可能的解决方案(但不是唯一正确的解决方案)是使用策略模式:定义一个代表回调的接口,并为您需要的每个不同回调实现接口。然后,您可以将这些回调作为参数传递,就像在Javascript中一样,但这些回调不能访问调用它们的类的任何非公共成员。

另外请务必查看Apache Commons Functor库,其中主要是有代表函数的对象。我从未使用它,但作为Apache Commons,如果我有你的要求,它肯定会是我的第一站。

答案 2 :(得分:0)

由于经典的非功能性Java不适合您提到的那些运行时目标,因此您可以轻松地感到沮丧。

但实际上,你可以使用这样的接口在java中实现回调:

参考:CALLBACK PATTERN IN JAVA ENVIRONMENT

例如,假设您希望在事件发生时收到通知。

您可以定义如下界面:

public interface SomeEvent{
    // A regular method, it can return something or take arguments
    public void someEventMethod();
}

然后,定义一个将发出信号/通知事件的类,它需要期望实现SomeEvent接口的对象,然后根据需要调用someEventMethod()方法。

public class EventNotifier{
    private SomeEvent se;
    private boolean somethingHappened; 
    public EventNotifier (SomeEvent event){
         //Save the event object for later use.
         se = event; 
         // Nothing to report yet.
         somethingHappened = false;
    } 
    //...  
    public void doWork (){
        //Check the predicate, which is set elsewhere.
        if (somethingHappened){
             //Signal the even by invoking the interface's method
             se.someEventMethod();
        }
        //...
    } 
    // ...
}

最后,编写一些期望接收事件通知的代码,它必须实现SomeEvent接口,并将对自身的引用传递给事件通知器,如下所示:

public class CallMe implements SomeEvent{
    private EventNotifier en; 

    public CallMe (){
         //Create the event notifier and pass itself to it.
         en = new EventNotifier (this);
    } 

    //Define the actual handler for the event
    public void someEventMethod(){
         // Some event interesting must have occurred
         // Do something...
    } 
}