如何从java中的构造函数中获取实例化对象?
我想存储对某些GUI类的父对象的引用,以模拟事件冒泡 - 调用父级处理程序 - 但我不想更改所有现有代码。
答案 0 :(得分:5)
简短回答:在Java中没有办法做到这一点。 (你可以找出哪个班级叫你,但下面的长答案也适用于大部分。)
答案很长:根据调用的位置神奇地表现不同的代码几乎总是一个坏主意。对于任何必须维护代码的人来说,这是一件令人困惑的事情,它会严重损害你的重构能力。例如,假设您意识到实例化对象的两个地方基本上具有相同的逻辑,因此您决定将公共位分解出来。惊喜!现在代码的行为有所不同,因为它是从其他地方实例化的。只需添加参数并修复呼叫者即可。从长远来看,这将为您节省时间。
答案 1 :(得分:3)
如果你想知道调用类,那么将“this”作为参数传递给构造函数。
Thing thing = new Thing(this);
编辑:允许重构的现代IDE将使这很容易。
答案 2 :(得分:1)
在不改变大量现有代码的情况下拦截方法调用(包括构造函数)是为Aspect-oriented programming做的一件事。
查看AspectJ作为开始。
使用AspectJ,您可以定义一个“切入点”,指定您要拦截某个对象或一组对象的构造函数调用(如果需要,使用通配符),并在拦截代码(“advice”)中,将给出方法上下文,其中包括有关调用方法和对象的信息。
您甚至可以使用AspectJ向对象添加字段以存储父引用,而无需修改其现有代码(这称为“简介”)。