找出类的构造函数中的实例化对象

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

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

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

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

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

Thing thing = new Thing(this); 

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

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

查看AspectJ的开始。

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

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