访问子类中的私有字段

时间:2013-07-25 11:53:01

标签: java inheritance

我正在创建一个扩展PropertyChangeSupport的类。我目前要做的是覆盖firePropertyChange()

firePropertyChange,因为它在PropertyChangeSupport中实现:

public void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
    if (oldValue == null || newValue == null || !oldValue.equals(newValue)) {
        firePropertyChange(new PropertyChangeEvent(this.source, propertyName, oldValue, newValue));
    }
}

我打算覆盖firePropertyChange

public void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
    if (oldValue == null || newValue == null || !oldValue.equals(newValue)) {
        firePropertyChange(new JoystickPropertyChangeEvent(this.source, propertyName, oldValue, newValue)); //compile error: source is not visible
    }
}

JoystickPropertyChangeEvent是我创建的一个类,它扩展了ProperyChangeEvent

问题是我的预期实现没有编译,因为源是私有的,getters中没有PropertyChangeSupport,所以子类无法访问它。我无法修改PropertyChangeSupport的代码。

是否有更优雅的解决方法,而不是将 source 的私有副本作为我的子类的字段?

相关问题: How to access the private variables of a class in its subclass?

5 个答案:

答案 0 :(得分:1)

我会质疑这个的设计。

您尝试覆盖的方法由于某种原因而被设置为私有,即使您可以更改其实现,我也不会建议它,因为您不知道这将在其他地方产生什么影响。

答案 1 :(得分:1)

如果你真的很蠢,你可能会尝试用反射来解决这个问题。但这太复杂了我甚至都不会再提起它了。

您的目标似乎是让属性变更听众能够将某些事件与其他事件区分开来。如果听众可以在没有帮助的情况下将他们分开,就这样做。如果这不方便,请提供一个静态方法来分析属性更改事件并返回它是否应该是JoystickPropertyChangeEvent

另外,为什么要使用房产变更事件呢?如果您想在操纵杆状态更新时触发事件,则应该为此激活自己的自定义事件。

答案 2 :(得分:1)

由于你扩展PropertyChangeSupport,你在构造函数中调用super()是否正确? PropertyChangeSupport的原始构造函数将source(即bean)作为参数。

public PropertyChangeSupport(Object sourceBean)

sourceBean参数是您想要的source。使用您自己的私有成员来保存该引用。然后你可以在firePropertyChange()方法中使用它。

public static class MyPropertyChangeSupport extends PropertyChangeSupport {
    private Object mySource;

    public MyPropertyChangeSupport(Object sourceBean) {
        super(sourceBean);
        // store the bean reference in your field
        this.mySource = sourceBean;
    }

    @Override
    public void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
        if (oldValue == null || newValue == null || !oldValue.equals(newValue)) {
            // use mySource here
            firePropertyChange(new JoystickPropertyChangeEvent(mySource, propertyName, oldValue, newValue)); 
        }
    }
}

答案 3 :(得分:0)

您可以将反射用于此目的。

如果ParentClass私有变量类似于

private String private_source_parent = "some_value";

在您的ChildClass中扩展父类

ParentClass obj = new ParentClasS();
Field f = obj.getClass().getDeclaredField("private_source_parent"); //NoSuchFieldException
f.setAccessible(true);
String source_inchild = (String) f.get(obj);

在您的ChildClass中,您将获得父私有成员的值。

答案 4 :(得分:-1)

您可以使用超类的getter方法来获取source属性 即。

super.firePropertyChange(new JoyStickPropertyChangeEvent(super.getSource, propertyName, oldValue, newValue); 

这应该可以解决问题。作为解释,您必须显式调用超类的firePropertyChange方法。这是通过关键字super。

完成的

希望这有帮助

干杯