是否可以在java中访问字段之前执行代码?

是否可以在java中访问字段之前执行代码?,java,reflection,field,Java,Reflection,Field,我正在尝试用java自动构造一些对象 为此,我有以下示例类: class TestInjected extends CommonAncestor { TestInjected() { System.out.println("I am Test Injected"); } void exist() { System.out.println("Hey there, I exist"); } } class CommonAncestor { CommonA

我正在尝试用java自动构造一些对象

为此,我有以下示例类:

class TestInjected extends CommonAncestor {

  TestInjected() {
    System.out.println("I am Test Injected");
  }

  void exist() {
    System.out.println("Hey there, I exist");
  }

}

class CommonAncestor {

  CommonAncestor() {
    super();
    init();
  }

  void init() {
    try {
        Field f = this.getClass().getDeclaredField("x");
        f.set(this, f.getType().newInstance());
    } catch (NoSuchFieldException e) {
    } catch (IllegalAccessException e) {
    } catch (InstantiationException e) {
    }
  }

}

public class TestInjection extends CommonAncestor{
  TestInjected x;
  private TestInjected y;

  private TestInjected getY() {
    if (y == null) {
      y = new TestInjected();
    }
    return y;
  }

  public TestInjection() {
    super();
  }

  public void test() {
    x.exist();
  }

  public void test2() {
    getY().exist();
  }

}
我还有一个测试课程:

public class TestInjectionTest {

  @Test
  public void test1() {
    TestInjection t = new TestInjection();
    t.test();
    t.test2();
  }
}
我在这里做的是,在构造函数上,我检查字段x,并通过反射初始化它。通过这种方式,我确保每当调用一个方法时(如本例中的test()),字段x都已经初始化,因此它可以工作

第二种方法是强制程序员使用getter,在本例中,用于字段y,其中getter方法确保初始化对象

然而,我想知道,当访问变量时,hava是否有任何方法来执行反射。比方说,不必在构造函数上执行反射代码,只要需要“x”,就可以执行该代码

i、 e:

-->检查x是否被调用,初始化它,然后调用exist()


任何一种反射方法,或任何一个库,都能给我这个答案吗?

我真的不知道你想解决什么问题,但我确信有更好的解决方案。与平台合作,而不是对抗平台。尽管如此,在一般情况下,答案是否定的。您可以运行重写字节码的程序(本质上是在幕后添加一个getter),但不能直接截取字段访问

如果需要初始化字段,请将字段设为私有字段,并使用方法公开它们。或者在构造函数中执行


编辑:根据你的评论,我认为你真正想要的是依赖注入。看看CDI()或Spring()或Guice()。

似乎您试图实现错误的目标。不幸的是,我还不知道你真正关心的是什么。换句话说:你想要解决的真正问题是什么。你所做的是我在Java中见过的最糟糕的事情之一。你能举一个真实的例子说明你想要实现什么吗。感觉你对一个非常简单的问题想得太多了。还有,这让人想起XY问题()这只是一个非常简单的例子,不想解释整个问题。总而言之,我试图拥有不同的相互关联的对象,它们之间相互引用。我不想让所有的程序员都非常小心地首先构造这个对象,以避免每个对象都有一个以上的实例。。。比方说,它比这个小例子更复杂
x.exist()