Bor*_*vić 2 java reflection abstract-class private-members
有一个抽象类:
public abstract class AbstractAny {
private long period;
public void doSomething() {
// blah blah blah
period = someHardcodedValue;
// blah blah blah
}
}
Run Code Online (Sandbox Code Playgroud)
我不想更改抽象类的来源,但需要在字段周期的设置方面增加一些灵活性.是否可以从覆盖方法更改字段周期的值?例如:
public class ConcreteSome extends AbstractAny{
@Override
public void doSomething() {
try {
Field p = super.getClass().getDeclaredField("period");
p.setAccessible(true);
p.setLong(this, 10L);
} catch (SecurityException e) {
throw new RuntimeException(e);
} catch (NoSuchFieldException e) {
throw new RuntimeException(e);
} catch (IllegalArgumentException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试运行此代码时super.getClass().getDeclaredField("period")
抛出java.lang.NoSuchFieldException: period
Jon*_*eet 20
你需要getClass().getSuperclass()
获得超类,而不是super.getClass()
.
但是,我真的不建议这样做.你基本上是在破坏抽象类的封装.如果抽象类没有为其后代提供足够的灵活性,那么它应该是固定的 - 绕过它只是在寻找麻烦.如果抽象类的其他成员需要在这个时候更改,该怎么办?拥有私有状态的全部意义在于,班级能够保护自己的数据.使用像这样的反射是一个非常丑陋的黑客应该是绝对的最后手段.
归档时间: |
|
查看次数: |
5111 次 |
最近记录: |