我有一个如下所示的 Java 类:
public class My_ABC
{
int a=0;
boolean B=true;
static // Initialize and load existing data only once at start-up
{
// need to know if it's called from its own main()
// or by another class to conditionally set veriables
}
public My_ABC(int AA,boolean BB)
{
}
public static void main(String[] args)
{
My_ABC my_abc = new My_ABC(3,true);
}
}
因为静态 block 在加载类时运行,我如何检测它是从它自己的 main()
调用还是由另一个类调用以有条件地设置变量?
当你们中的一些人说“各种各样的钟声响起!”时,我明白了。好吧,这是因为我遇到了一个情况:我正在设计一个类,需要将大量数据加载到我的 PC(4G Ram)的极限,而我正在运行只能使用 1.5G 的 32 位版本的 Java拉姆最大;所以当我自己测试这个类时,我需要加载尽可能多的数据来测试所有可能的情况,但是当它被多个其他类调用时,它不能这样做(会导致堆空间不足错误),所以它应该只加载分钟。需要的数据。然而,由于所有数据只应在启动时加载一次,因此它应该位于静态 block 中;否则我需要实现额外的逻辑来检测它是第一次加载(需要加载数据),还是第二次、第三次(不应该一次又一次地加载数据)。如果我实现额外的逻辑来执行此操作并将数据加载代码移出静态 block ,这将导致不必要的复杂性,因为如果我移动到 64 位版本的 java(希望很快),那么额外的复杂性将是额外的负担(我将有足够的空间来加载所有数据,即使是从其他类调用时也是如此)。所以临时快速修复是在静态 block 中检测它并相应地处理差异,当我有足够的空间时,只需将它们注释掉而无需更改编程逻辑结构。
感谢所有的回答和建议,我尝试了“StackTraceElement”方法,效果很好!它解决了我的问题。
最佳答案
我认为你绝对应该改变你的方法。
但是自从你asked something concrete在这里(别人总结的)。
public class X {
static {
System.out.println("Static free block");
StackTraceElement [] st = new RuntimeException("").getStackTrace();
if( st.length == 1 ) {
System.out.println("Invoked from main");
} else {
System.out.println("Invoked from somewhere else");
}
}
public static void main( String [] args ) {
System.out.println("Main");
}
}
用这个来测试它:
public class Y {
public static void main( String [] args ) {
X x = new X();
}
}
<子> 我不知道为什么约瑟夫删除了他在正确轨道上的回答。
关于java - 如何检测一个 Java 类是被它自己的 main() 调用还是被另一个类调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/965964/