Java 访问子类中的私有字段

Java 访问子类中的私有字段,java,inheritance,Java,Inheritance,我正在创建一个扩展PropertyChangeSupport的类。我当前要做的是重写firePropertyChange(): 在PropertyChangeSupport中实现的firePropertyChange: public void firePropertyChange(String propertyName, Object oldValue, Object newValue) { if (oldValue == null || newValue == null || !old

我正在创建一个扩展
PropertyChangeSupport
的类。我当前要做的是重写
firePropertyChange()

在PropertyChangeSupport中实现的firePropertyChange:

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
是我创建的一个类,它扩展了
PropertyChangeEvent

问题是,我的预期实现没有编译,因为源代码是私有的,并且在
PropertyChangeSupport
中没有
getter
,所以子类无法访问它。我无法修改
属性更改支持
的代码

有没有比将源文件的私有副本作为我的子类字段更优雅的解决方法

相关问题:

我会质疑这个的设计


您试图覆盖的方法被私有化是有原因的,即使您可以更改它的实现,我也不会建议您这样做,因为您不知道这会对其他地方产生什么影响。

我会质疑它的设计


您试图覆盖的方法被设置为私有是有原因的,即使您可以更改其实现,我也不会建议您这样做,因为您不知道这将对其他地方产生什么影响。

您可以使用超类的getter方法来获取源属性 i、 e

这应该能奏效。作为解释,您必须显式调用超类的firePropertyChange方法。这是通过关键字super完成的

希望这有帮助


干杯

您可以使用超类的getter方法来获取源属性 i、 e

这应该能奏效。作为解释,您必须显式调用超类的firePropertyChange方法。这是通过关键字super完成的

希望这有帮助


干杯

如果你真的很愚蠢,你可以试着用反思来解决这个问题。但这太复杂了,我再也不提了

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


另外,为什么要使用属性更改事件?如果你想在操纵杆状态更新时触发事件,你应该为此触发你自己的自定义事件。

如果你真的很笨,你可以尝试用反射来解决这个问题。但这太复杂了,我再也不提了

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


另外,为什么要使用属性更改事件?如果要在操纵杆状态更新时触发事件,则应为此触发自己的自定义事件。

您可以使用反射

如果ParentClass私有变量类似

private String private_source_parent = "some_value";
在您的子类中,哪个扩展父类

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

在您的子类中,您将获得父级私有成员的值。

为此,您可以使用反射

如果ParentClass私有变量类似

private String private_source_parent = "some_value";
在您的子类中,哪个扩展父类

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

在您的子类中,您将获得父级私有成员的值。

因为您扩展了
PropertyChangeSupport
您正在调用构造函数中的
super()
,对吗?
PropertyChangeSupport
的原始构造函数将
源代码(即bean)作为参数

公共属性更改支持(对象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)); 
        }
    }
}

既然您扩展了
PropertyChangeSupport
,那么您正在构造函数中调用
super()
,对吗?
PropertyChangeSupport
的原始构造函数将
源代码(即bean)作为参数

公共属性更改支持(对象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)); 
        }
    }
}

这将调用该方法,但不会更改其实现。调用公共void firePropertyChange(字符串propertyName、对象oldValue、对象newValue);仍然会导致调用错误的方法。我在文档中看不到该方法被声明为私有
public void firePropertyChange(PropertyChangeEvent evt)
根据[。可能超类的getSource方法是私有的,但他应该自己实现此方法。这会调用该方法,但不会更改其实现。调用public void firePropertyChange(String propertyName、Object oldValue、Object newValue);仍然会导致调用错误的方法。我在文档中看不到此方法声明为私有?
public void firePropertyChange(PropertyChangeEvent evt)
根据[.可能超类的getSource方法是私有的,但他应该自己实现这个方法。这是一个可怕的黑客行为,只有在没有其他方法解决问题的情况下,你才应该这样做。没有这个黑客行为,有没有其他方法可以访问父类的私有数据成员,而子类中没有getter方法?可能吧不