有什么方法可以在运行时检索实例的声明类吗?例如:
public class Caller {
private JFrame frame = new JFrame("Test");
private JButton button = new JButton("Test me");
private Callee callee = new Callee();
public Caller() {
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(button);
button.addActionListener(callee.getListener());
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
new Caller();
}
}
被叫方:
public class Callee {
public ActionListener getListener() {
return new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
/* Get the class "Caller" here and invoke its methods */
/* Something along the lines of: */
Object button = e.getSource();
button.getOwnerClass(); //This would return the type Caller
}
};
}
}
"getOwnerClass()"是一个假想的方法。有没有办法得到类似的结果?
标准API中没有任何内容允许您获取这些信息。"声明类"或"所有者类"的意思有点不清楚,但为了这个答案,我假设正是这个类的代码创建了对象的实例(你想要所有者类)。
默认情况下,JVM不会存储这些信息。
但是,使用与JDK发行版一起打包的堆探查器,您可以记录对象分配点的堆栈跟踪,并且这些信息可以在不同的时间点写入文件。
这仍然不能给您一个API调用来检索信息,但它表明记录这种类型的信息在技术上是可能的。
我在谷歌上搜索了一下,发现有人创建了一个API,它使用了与堆剖析器(java.lang.instrumentation
包/JVMTI接口)相同的基本技术
- 开源项目:java分配工具
只要做一点工作,你就应该能够用它构建一些东西。
该网站有一个很好的例子:
AllocationRecorder.addSampler(new Sampler() {
public void sampleAllocation(int count, String desc, Object newObj, long size) {
System.out.println("I just allocated the object " + newObj +
" of type " + desc + " whose size is " + size);
if (count != -1) { System.out.println("It's an array of size " + count); }
}
});
您应该使用new Exception().getStackTrace()
获取stacktrace,而不是打印,移除引用采样器和API类的前几个StackTraceElement
对象,然后调用StackTraceElement.getClassName()
以获取创建对象实例的类的名称,换句话说,就是您的OwnerClass。