Java

【Java】同一パッケージ同一クラス名が別々に存在していた場合(クラス競合時)の挙動に関する実験


ふと思い立ってやってみた実験。
jar内と自作したクラス、もしくはjar同士などで、クラスが競合している場合の動きを実験する。
「競合」って言い方が正しいのかどうかわからないが、要するに
「com.test.Test」みたいなクラスがあったとき、
それとまったく同じパッケージ構成・名前のクラスが、別々の場所にそれぞれ2つ(ないし2つ以上)存在していた場合の挙動に関する実験である。
現プロジェクトでも一部のクラスが完全競合しているので動きが少し気になっていたのだ。
周囲の風説(?)に寄れば、「こういう場合、Javaの気まぐれに寄るので、どっちのクラスが使われるのかわからない」という、恐ろしい内容も耳にしている。
一方で、「クラスパスに指定した順(クラスローダ―が読み込む順)に応じて順次上書きしていく」というような話も聞いている。
どっちが正しいのか?実験してみる。
まあそもそも競合なんておこさないほうがいいに決まってるんだけどね。


 


【Java】Java1.6/SolarisのSSL通信バグ対応


SOAPで接続していた連携先のシステムに、ある日突然つながらなくなった。
SOAP連携の処理で接続しようとすると以下のようなJavaのStackTraceが出てくる。

…  
Caused by: java.lang.RuntimeException: Could not parse key values  
        at sun.security.pkcs11.P11Key$P11ECPublicKey.fetchValues(P11Key.java:1000)  
        at sun.security.pkcs11.P11Key$P11ECPublicKey.getW(P11Key.java:1021)  
        at com.sun.net.ssl.internal.ssl.ECDHClientKeyExchange.<init>(ECDHClientKeyExchange.java:40)  
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverHelloDone(ClientHandshaker.java:779)  
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:238)  
        at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:593)  
        at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:529)  
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:958)  
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1203)  
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1230)  
        ... 89 more  
Caused by: java.io.IOException: extra data given to DerValue constructor  
        at sun.security.util.DerValue.init(DerValue.java:368)  
        at sun.security.util.DerValue.<init>(DerValue.java:277)  
        at sun.security.pkcs11.P11Key$P11ECPublicKey.fetchValues(P11Key.java:991)  
        ... 98 more  
…  


Java1.6/OS:Solaris。
ただ、なぜかJava1.6/OS:Windowsだと問題なく動く。(JavaのVerは同じでOSだけ違う)


【Java】Exceptionを強制throwさせて絶対そこで処理を中断させる


「とにかく何が何でもそこから先の処理にいってほしくない」という場合、
処理を強制的に中断させる目的で無条件にExceptionをthrowするようなコーディングするとコンパイルエラーになる。
ただこれにちょっと手を加えることで、誰がどう見ても明らかに絶対そこで落ちるにも関わらず
結果的に強制処理中断するロジックとして成立させることができる。


 


【Java】Servletでファイルダウンロードさせる基本的な仕組みとファイル名に関するちょっとした実験


Servletでファイルダウンロードさせる実装のメモ
と、ダウンロードファイル名に関するちょっとした実験の結果

ダウンロードの動きを取るかどうかは、最終的にはブラウザに依存するようだが、
レスポンスヘッダ「Content-Disposition」に「attachment」をいれてやり、
かつファイルの種類によって適切なContent-typeを指定することで、
ダウンロードの動きになるようである。


 


【java】FileFilterメモ


File#listFilesでFileオブジェクトの配列を取得するとき、FileFilterを引数に与えると、取得してくるFileオブジェクトを絞り込むことができる。
ただそのためのFileFilterクラスは自分で自作しないとならない。
FileFilterはインターフェースなので、実装(implements)した個別クラスを定義し、「accept」メソッドを実装する。