java - 如何检测一个 Java 类是被它自己的 main() 调用还是被另一个类调用?

标签 java static initialization

我有一个如下所示的 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/

相关文章:

c++ - 检测成员变量的阴影

Java iterator.hasNext() 始终为真

java - 在主方法中创建同一类的实例是否会创建两个实例?

c++ - 使用 block 在 C++ 中避免在初始化期间复制变量

static - 扩展 Spring Boot WebMvcConfigurationSupport 时出现静态资源问题

java - 从类数组调用方法会给出 NullPointerException

java - 在Java中,为什么有的变量需要先初始化,有的只需要声明?

java - 具有一些条件的字符串排列

java - Hibernate 中 DTO 和延迟加载之间有什么关系

java - 严重 : Context initialization failed org. springframework.beans.factory.BeanCreationException:创建名称为 'sessionFactory' 的 bean 时出错