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方法?可能吧不