週に一回は書きますよ 月に4つ記事を書けばノルマは満たされます。
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Cのmain蹂躙にインスパイアド。shinhさんにすでに書かれておるとかは気にしません。

Java言語仕様 実行を参照してください。 実行時はクラスロード→初期化→mainを呼ぶ、という順番になっているので、初期化中に仕事を済ませればよいというわけです。細かいところはVM仕様を参照します。後で後で。

まず基本形。

>type NoMain.java
import java.io.*;
public class NoMain{
    static{
        System.out.println("Hello world!");
        System.exit(0);
    }
}

>javac NoMain.java

>java NoMain
Hello world!

>

こんな感じで、mainなしのJavaプログラムが出来ます。

ところで、Java.System.exit()の周辺には Java.Runtime.addShutdownHookという関数があります。 こいつはCのatexitのように、exit後に実行する処理を指定できます。よってこれを使うことによって、mainを一度も呼ばないばかりか蹂躙するのと似たコードが出来るかしらと。

>type FlagMain.java
import java.io.*;
public class FlagMain implements Runnable
{
    private static FlagMain f=new FlagMain();
    public static int main=0;
    public FlagMain(){
        hoge();
        //System.exit(0);
    }
    public void hoge(){
        if ( main==0 ) {
            System.out.print("Hello ");
            Runtime.getRuntime().addShutdownHook(new Thread(this));
        }
        else
            System.out.println("world!");
        main++;
    }
    public void run(){hoge();}
}

>javac FlagMain.java

>java FlagMain
Hello Exception in thread "main" java.lang.NoSuchMethodError: main
Hello Exception in thread "Thread-0" java.lang.IllegalStateException: Shutdown in progress
        at java.lang.Shutdown.add(Unknown Source)
        at java.lang.Runtime.addShutdownHook(Unknown Source)
        at FlagMain.hoge(FlagMain.java:13)
        at FlagMain.run(FlagMain.java:19)
        at java.lang.Thread.run(Unknown Source)

>
???なんかまちがえたにょろ?

Helloが二回表示されているということは、どうみてもmainが0のままです。

正解はこちら。何を間違えたかは、Java Puzzlersを読んでいればすぐわかりますね。

>type FlagMain.java
import java.io.*;
public class FlagMain implements Runnable
{
    public static int main=0;
    private static FlagMain f=new FlagMain();
    public FlagMain(){
        hoge();
        //System.exit(0);
    }
    public void hoge(){
        if ( main==0 ) {
            System.out.print("Hello ");
            Runtime.getRuntime().addShutdownHook(new Thread(this));
        }
        else
            System.out.println("world!");
        main++;
    }
    public void run(){hoge();}
}

>javac FlagMain.java

>java FlagMain
Hello Exception in thread "main" java.lang.NoSuchMethodError: main
world!

>

あとはこのNoSuchMethodErrorの出力をなくしたいと思います。 コメントアウトされているexitを入れるとなぜかHelloだけ表示されて制御が戻らず、その後Ctrl-Cでも戻ってこなくなってしまいます。なにか使い方を間違っているようなのであとで調査します。

スポンサーサイト
コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
http://gusmachine.blog49.fc2.com/tb.php/96-6b171cf8
この記事にトラックバックする(FC2ブログユーザー)
この記事へのトラックバック
前回、Javaでpublic static void mainを通過せずにJavaプログラムを動かすことに成功しました。その方法は、起動されたクラスの初期化のタイミングを利用するというものでした。さらに、JavaにはJava.lang.Runti
2006/12/16(土) 00:43:21 | 揺動散逸日記
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。