Печать сообщения на консоли без использования метода main()

Мне задали этот вопрос в интервью.

Как печатать сообщение на консоли без использования метода main()?

Ответы

Ответ 1

public class Foo {
    static {
         System.out.println("Message");
         System.exit(0);
    } 
}

System.exit(0) завершает работу программы, прежде чем jvm начнет искать main()

Идеальная ссылка

(Примечание: даже если он компилируется с помощью JDK 7 javac, он не может быть запущен с его java, потому что он ожидает метод main(String[]).)

Ответ 2

public final class Main {
    static {
        System.out.println("Hello World");
        System.exit(0);
    }
}

Статический блок сначала выполняется, как только класс загружается до вызова метода main();, и поэтому до вызова main() System.exit(0) инициирует завершение работы VM.

Метод System.exit останавливает выполнение текущего потока, а все остальные мертвы в своих дорожках. Когда вызывается System.exit, перед закрытием виртуальная машина выполняет две задачи очистки.

Во-первых, он выполняет все завершающие блокировки, зарегистрированные в Runtime.addShutdownHook. Это полезно для выделения ресурсов, внешних для виртуальной машины. Используйте крючки отключения для поведения, которое должно произойти до выхода VM.

Вторая задача очистки, выполняемая виртуальной машиной при вызове System.exit касается финализаторов. Если либо System.runFinalizersOnExit, либо его злой близнец Runtime.runFinalizersOnExit, VM запускает финализаторы на все объекты, которые еще не были доработаны. Эти методы были устаревшими время назад и не без оснований. Никогда не звоните System.runFinalizersOnExit или Runtime.runFinalizersOnExit по любой причине: они являются одними из самых опасных методов в библиотеках Java. Вызов этих методов может привести к запуску финализаторов на живых объектах, в то время как другие потоки одновременно манипулируют их, что приводит к неустойчивому поведению или взаимоблокировке.

Таким образом, System.exit немедленно останавливает все потоки программ; Это не заставляют, наконец, блоки выполнить, но он запускает завершающие крюки перед остановкой VM. Используйте прерывания для завершения внешних ресурсов, когда виртуальная машина отключается вниз. Можно приостановить работу виртуальной машины, не выполняя перехваты при закрытии System.halt, но этот метод редко используется.

Ответ 3

В файле с именем A.java

class Con {
    String hi = "\n\nHello World\n\n";
}

Вам просто нужно скомпилировать программу в Windows. Не запускайте его.:-P

Ответ 4

class MainMethodNot
{
    static
    {
        System.out.println("Hello World");
        System.exit(0);

    }
}

Поскольку статический блок инициализатора выполняется при первом загрузке класса, мы можем распечатать "Hello World" без написания основного метода. Выполнение прекращается с использованием команды "System.exit()". Таким образом, мы предотвращаем ошибку "основной метод не найден". Это довольно сложный вопрос

Ответ 5

Вы можете определить пользовательский загрузчик классов, который печатает ваше сообщение:

public class MyClassLoader extends ClassLoader {
    public MyClassLoader(ClassLoader other) {
         super(other);
         System.out.println("Hi there");
         System.exit(0);
    }
}

Затем запустите команду java:

java -Djava.system.class.loader=MyClassLoader

(не нужно добавлять класс в качестве параметра)

Ответ 6

В java 6 можно было использовать System.out.println(); без main(). Начиная с java 7, это невозможно сделать со статическим блоком. Он по-прежнему будет запрашивать основной метод в основном классе.

Ответ 7

Если вы также не хотите использовать статический блок, это можно сделать следующим образом.

public class NoMain {

    private static final int STATUS = getStatus();

    private static int getStatus() {
        System.out.println("Hello World!!");
        System.exit(0);
        return 0;
    }

}

Однако, обратите внимание, что это для версии Java 6. Его не работает в Java 7, который, как говорят, поддерживается на Java 8. Я пытался использовать JDK 1.8.0_77-b03, который все еще не работает

Ответ 8

Да, одним из способов является статический блок, но в предыдущей версии JDK не в JDK 1.7.

class Withoutmain{  
 static{  
  System.out.println("Message: Your message can be print on console without main() method");  
  System.exit(0);  
 }  
}  

Выход: Сообщение: ваше сообщение может быть напечатано на консоли без метода main() (если не JDK7)

Выход: ошибка: главный метод, не найденный в классе A3, определите основной метод следующим образом: public static void main (String [] args)

Ссылка

Ответ 9

На самом деле это не работает в последнем обновлении java 8. Вы можете назвать это исправлением ошибок в соответствии с ними, но насколько я уверен в своих текущих знаниях, это нельзя назвать исправлением ошибки, поскольку оно также приводят к нескольким концептуальным изменениям в программировании Java.

Ответ 10

Да, вы можете распечатать сообщение на консоли без использования main().

Создайте тест с помощью JUnit и выполните его:

@Test
public printTest()   {
   System.out.println("myprint");
}