4

我想在 C 和 JAVA 语言的 main 函数之前执行一个函数。我知道一种方法,就是在 C 语言中使用#pragma指令。有没有其他方法可以在这两种语言中做到这一点?

4

7 回答 7

6

我可以想到两种简单的(-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 中的默认类加载器?

于 2013-06-27T08:13:58.290 回答
5

在java中你可以使用静态块

public class JavaApplication2 {

    static {
        System.out.println("in static ");
    }

    public static void main(String[] args) {
        System.out.println("in main ");
    }
}
于 2013-06-27T08:00:52.263 回答
1

作为 C 标准的扩展,gcc 提供了 function 属性constructor,允许在之前调用函数main()

有关详细信息,请参阅此处(向下滚动)。这个 SO question 及其答案也对此有所帮助。

于 2013-06-27T08:39:01.943 回答
1

尝试将一个静态块和一个包含您想要在 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
于 2013-06-27T08:04:41.033 回答
0

它可能是您从 main 函数调用的第一件事。这样它就会在你的“真正的”主要功能之前运行。

于 2013-06-27T08:01:27.783 回答
0

使用那个方法(你想在 main 方法之前运行的)作为你的 main 方法。

然后就这么简单

或者static在之前使用块main()

于 2013-06-27T08:04:09.783 回答
0

在 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()方法。

输出 上述代码的输出

于 2022-01-06T22:20:46.863 回答