是否可以在java中访问字段之前执行代码?
我正在尝试用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
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()