我想在 C 和 JAVA 语言的 main 函数之前执行一个函数。我知道一种方法,就是在 C 语言中使用#pragma
指令。有没有其他方法可以在这两种语言中做到这一点?
7 回答
我可以想到两种简单的(-ish)方法在 Java 中做到这一点:
方法 #1 - 静态初始化器
例如:
public class Test {
static {
System.err.println("Static initializer first");
}
public static void main(String[] args) {
System.err.println("In main");
}
}
方法 #2 - 代理主服务器。
public class ProxyMain {
public static void main(String[] args) {
String classname = args[0];
// Do some other stuff.
// Load the class
// Reflectively find the 'public static void main(String[])' method
// Reflectively invoke it with the rest of the args.
}
}
然后,您将其启动为:
java <jvm-options> ... ProxyMain <real-Main> arg ...
还有第三种方法,但需要一些“极端措施”。基本上,您必须创建自己的 JVM 启动器,该启动器使用不同的方案来启动应用程序。main
在加载入口点类并调用它的方法之前,让它做额外的事情。(或者做一些完全不同的事情。)
你甚至可以替换默认的类加载器;例如,如何更改 Java 中的默认类加载器?
在java中你可以使用静态块
public class JavaApplication2 {
static {
System.out.println("in static ");
}
public static void main(String[] args) {
System.out.println("in main ");
}
}
作为 C 标准的扩展,gcc 提供了 function 属性constructor
,允许在之前调用函数main()
。
有关详细信息,请参阅此处(向下滚动)。这个 SO question 及其答案也对此有所帮助。
尝试将一个静态块和一个包含您想要在 main 方法之前执行的内容的静态方法结合起来。
package test;
public class Main {
static {
beforeMain();
}
public static void main(String[] args) {
System.out.println("after");
}
private static void beforeMain() {
System.out.println("before");
}
}
输出:
before
after
它可能是您从 main 函数调用的第一件事。这样它就会在你的“真正的”主要功能之前运行。
使用那个方法(你想在 main 方法之前运行的)作为你的 main 方法。
然后就这么简单
或者static
在之前使用块main()
在 java 中,可以在main()方法执行之前执行任何其他方法。为此,我们需要一个静态初始化块。它以静态关键字开头。喜欢:
static {
// statements
}
现在尝试通过实际的代码实现来理解。
public class BefourMain {
static int sum;
static {
sum = add(4,5,6);
System.out.println("Calling add() method: " + sum);
System.out.println("\ncalling main");
main(null);
System.out.println("Main end\n");
System.out.println("Now JVM calling main()\n");
}
public static void main(String[] args) {
int sum = add(1,2,3);
System.out.println(sum);
}
static int add(int a, int b, int c) {
return a + b + c;
}
}
现在尝试通过实际的代码实现来理解。
当我们开始执行此代码时,静态初始化程序块将首先开始执行,在静态初始化程序块中,我们调用add()方法并将值存储在静态变量中,然后打印它。接下来,我们将调用main()方法,该方法将执行。当静态初始化块执行完成时,JVM 将再次调用main()方法。
输出 上述代码的输出