java - 如何从Java中的抽象类改变私有(private)字段?

标签 java reflection abstract-class private-members

有一个抽象类:

public abstract class AbstractAny {
  private long period;

  public void doSomething() {
    // blah blah blah
    period = someHardcodedValue;
    // blah blah blah
  }
}

我不想更改抽象类的源,但需要在如何设置字段周期方面添加一些灵 active 。是否可以通过重写方法更改字段周期的值?例如:

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);
    }
  }
}

当我尝试运行此代码时 super.getClass().getDeclaredField("period") 抛出 java.lang.NoSuchFieldException: period

最佳答案

您需要 getClass().getSuperclass() 来获取父类(super class),而不是 super.getClass()

但是,我真的不建议这样做。您基本上破坏了抽象类的封装。如果抽象类没有为其后代提供足够的灵 active ,则应该对其进行修复 - 绕过它只是自找麻烦。如果每当这个抽象类的其他成员需要更改时,该怎么办?拥有私有(private)状态的全部目的是让类能够保护自己的数据。像这样使用反射是一个非常丑陋的黑客,这应该是绝对的最后手段。

关于java - 如何从Java中的抽象类改变私有(private)字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1222480/

相关文章:

reflection - Kotlin-jvm 和 Kotlin-js 之间 KClass 的不同行为

c# - 如何在实际类中引用枚举而不是 C# 中的基类

java - 如何拦截使用 WebClient/WebFlux 形成的所有传出 HTTP 请求?

java - 找出IP地址?

java - 斜线 ("/") 添加到我的返回 URL

c# - 通过反射访问抽象类的属性

java - 通过 RESTful Web 服务编辑对象

java - 如何从 HandlerInterceptorAdapter 检索 modelAttribute

java - 为什么可以转换为抽象类

java - 实现 java Comparable<T> 类的问题