0

如何从 java 的构造函数中获取实例化对象?

我想为某些 GUI 类存储对父对象的引用以模拟事件冒泡 - 调用父处理程序 - 但我不想更改所有现有代码。

4

3 回答 3

5

简短的回答:在 Java 中没有办法做到这一点。(你可以找出哪个班级叫你,但下面的长答案大部分也适用于那里。)

长答案:根据调用它的位置而神奇地表现不同的代码几乎总是一个坏主意。这会让任何必须维护您的代码的人感到困惑,并且会严重损害您的重构能力。例如,假设您意识到实例化对象的两个位置具有基本相同的逻辑,因此您决定将公共位分解。惊喜!现在代码的行为有所不同,因为它是从其他地方实例化的。只需添加参数并修复调用者。从长远来看,它将为您节省时间。

于 2009-09-27T08:23:34.810 回答
3

如果您想知道调用类,则将“this”作为参数传递给构造函数。

Thing thing = new Thing(this);

编辑:允许重构的现代 IDE 将使这很容易做到。

于 2009-09-27T08:33:56.210 回答
1

在不更改大量现有代码的情况下拦截方法调用(包括构造函数)是面向方面编程的目的之一。

AspectJ开始。

使用 AspectJ,您可以定义一个“切入点”,指定您要拦截对某个对象或一组对象的构造函数调用(如果需要,使用通配符),并且在拦截代码(“建议”)中,您将获得方法上下文,其中包括有关调用方法和对象的信息。

您甚至可以使用 AspectJ 向对象添加字段以存储父引用,而无需修改其现有代码(这称为“介绍”)。

于 2009-09-27T08:10:28.787 回答