No Such Blog or Diary

«Prev || 1 | 2 | 3 | 4 | 5 | 6 || Next»

Javaの実行時環境取得

Tomcat で自前の properties ファイルがうまく読み込まれないので実行時のクラスパスの取得方を調べた.メモしておく.どうやら System.getProperty ないし System.getProperties で取得できるらしい.詳しくは API リファレンス 参照.ちなみに properties ファイルがうまく読み込まれないのは classpath などとは関係なくパーミッションのせいだった…  リード権限付けて /WEB-INF/classes においておけば大丈夫みたい.

genericタイプの配列 in Java

知らずに引っかかってしまったが,ここらへんの記述によると generic の配列は作れないそうな.代わりに Vector を使えばいいのだけど Java の Vector はアクセスが面倒…

Java to C#

Visual Studio .NET に Java から C# への変換機能があることを知ったので試してみた.結構機械的に置換できるからうまくいくだろうと思っていたら

//UPGRADE_TODO: コンストラクタ 'java.io.FileReader.FileReader' は、動作の異なる 'System.IO.StreamReader' に変換されました。

とかいわれて FileReader まわりがうまく変換されないらしい.ついでに複数個の Main があると怒られるのもどうにかしてほしいような... なんだかんだで結構面倒な気がする.

Java の quine program

Java で自分自身を出力する quine program を書いてみた.

結果はこんなん:

class Self {
    static String s="class Self {%n%tstatic String s=%c%s%c;%n%tpublic static void main(String [] args) {%n%t%tString ss=s.replaceAll(new String(new byte []{37, 110}), new String(new byte []{10}));%n%t%tss=ss.replaceAll(new String(new byte []{37, 116}), new String(new byte []{9}));%n%t%tss=ss.replaceAll(new String(new byte []{37, 99}), new String(new byte []{34}));%n%t%tss=ss.replaceAll(new String(new byte []{37, 115}), s);%n%t%tSystem.out.print(ss);%n%t}%n}%n";
    public static void main(String [] args) {
        String ss=s.replaceAll(new String(new byte []{37, 110}), new String(new byte []{10}));
        ss=ss.replaceAll(new String(new byte []{37, 116}), new String(new byte []{9}));
        ss=ss.replaceAll(new String(new byte []{37, 99}), new String(new byte []{34}));
        ss=ss.replaceAll(new String(new byte []{37, 115}), s);
        System.out.print(ss);
    }
}

ほとんど printf をエミュレートするような形で... 美しくないなぁ.%n, %c, %t, %s を改行,ダブルクオート,タブ,自身の文字列で置換すると.ついでなので(ある程度)任意のプログラムを読み込んで quine program にしてしまうプログラムも作ったので置いておこう.

Java の無名クラス

無名クラスの中で無名クラスを使いつつ,初期化用のメソッドまで呼んでいる分かりにくいコードを書いてみた.

        xpane.add(delTabButton = new JButton(){      // "Del Tab" ボタン
                JButton init(){
                    setText("Del Tab");
                    addActionListener(new ActionListener(){
                            public void actionPerformed(ActionEvent e){
                                delTab();
                            }
                        });
                    return this;
                }
            }.init());

init() が this をリターンしているのが鍵ですな.

JApplet の add と setLayout

Swing のいくつかのコンポーネントは getContentPane() というメソッドを使って ContentPane を取得し,そのContentPane に子要素を追加(add)したりレイアウト指定(setLayout)しなければならない.

で,Java 1.4 では JApplet もこの制約のかかるクラスであるため,間違って直接 add を使うコードを書くとコンパイルは通るが実行時にエラーを吐いて止まってしまう.一方,Java 5 では親切なことに add などが getContentPane().add などにリダイレクトされるようにオーバーライドされている.よって,直接 add を使うコードを Java 1.4 でコンパイルしたバイトコードも,実行環境が Java 5 であれば実行時にエラーを吐くことなく動く.

と,こんな仕様のため,今日はマシンによって動かないプログラムを見事に作ってしまったのであった.

«Prev || 1 | 2 | 3 | 4 | 5 | 6 || Next»
Search
Feeds

Page Top