Java

「Javaルールブック」の改訂版を書きました

数年前に発売された「Javaルールブック」という書籍の改訂のお話がありチームT2のメンバ(id:shot6,id:yone098,id:c9katayama,id:skirnir)で改訂作業を行なって来たのですが、ようやく作業が完了しましてこの度2/15に発売されることになりました。この書籍…

URLClassLoaderに与えるJarファイルのURLの書き方

URLClassLoaderの引数として与えるJarファイルのURLの書き方としては、 file:[Jarへのファイルパス] jar:file:[Jarへのファイルパス]!/ の2通りが可能ですが、実は挙動が異なります。クラスのロードやリソースの取得では同じ挙動をするのですが、ディレクト…

内部enumはstatic扱い

あるクラスCに内部enum Eを定義する場合、staticキーワードをつけるべきだろうか?enumはその性質上staticと扱われないといろいろ不都合が生じるため、内部enumを作る場合にはstaticにしないといけない気がするが、ではstaticキーワードをつけないとどうなる…

enumの要素に付与されたアノテーションの取得

enumの要素に付与されたアノテーションをプログラムから取得する方法。例えば次のようなenumがあるとして、 public enum Framework { @Skirnir YMIR, @Skirnir T2, CUBBY; } 要素「YMIR」に付与されたアノテーションを取得する場合、つい Skirnir annotation…

Seasar Conference 2009 Spring

来る6月13日に、Seasar Conference 2009 Springがあります。前回から期間が短く、準備期間が十分にとれなかったため、今回はYmirのセッションは申し込みませんでした。次回(秋くらいかな)は申し込むつもりですので、その時はYmirのセッションを聞きに来て…

Cookieに記録されているJSESSIONID

Tomcat6.0.18での話。セッションをinvalidateするとCookieに記録されているJSESSIONIDが自動的に削除されるかと思っていたが、どうも削除されないようだ。以前のセッションIDが残ったままになっている。なんか気持ち悪いので、セッションをinvalidateした後…

型パラメータつきクラスの中から指定された型パラメータを知る方法

型パラメータつきクラスHoeがあるとして、指定された型パラメータをHoeクラスの中から知る方法。 public class Hoe<E> { private Class<E> type; public Hoe(E... e) { @SuppressWarnings("unchecked") Class<E> type = (Class<E>) e.getClass().getComponentType(); thi</e></e></e></e>…

#ziplibで圧縮したZIPファイルをJavaの標準ライブラリで解凍できないことがある

題名の通り。.NETの世界に#ziplibというライブラリがあって、これを使って圧縮したZIPファイルをJavaのjava.util.zipパッケージの標準ライブラリで解凍しようとすると、例えば次のようなException(ZipException)が発生することがある。 invalid entry comp…

HttpServletRequest#setAttribute()の属性名

HttpServletRequest#setAttribute()で指定する属性名の規則。知らなかった…。 属性の名前は、パッケージ名と同じ規則に従う必要があります。java.*、javax.*、および com.sun.* で始まる名前は、Sun Microsystems で使用するように予約されています。 (J2EE…

Effective Java第2版

Effective Java 第2版訳本をざっと見たが、良くも悪くも直訳であるため読んでも意味不明な箇所が多い感じ。原文で意味がわかりづらい箇所があったので訳本の該当箇所を見てみたらそのまま直訳されていてやっぱりわかりづらかったり。解説本でもないとJavaに…

Freemarkerのexpressionで出力できる型

Freemarkerテンプレートに例えば ${value}と書いた場合、valueとして許される型は文字列または数値型だけのようである。boolean(Booleanも)は不可(エラーになる)。booleanの値を表示したい場合は次のようにstring built-inを使う必要がある。 ${value?st…

実行可能WARファイルの作り方

HudsonのWARはサーブレットコンテナに配備して動作するが、次のようにすることで単体で動作させることも可能になっている。 java -jar hudson.war 一体どういう風にしてこのようなことを実現しているのだろうと思い調べてみた。結果: 軽量サーブレットコン…

@SuppressWarningsアノテーションのvalueプロパティに指定できる値

Eclipseを使っているとQuick Fixの候補としてよく登場する@SuppressWarningsアノテーション。このアノテーションのvalueプロパティには"unchecked"等が指定できるが、指定できる文字列としては他に何があるのだろうか。というわけで調べてみた。試しにEclips…

chunkedの制御

Tomcat6ではレスポンスとして「Transfer-Encoding: chunked」なレスポンスを返すことができるが、この制御がどう行なわれているか分かっていなかったので調べてみた。具体的にはTomcat6の今日の時点でのtrunkのHttp11Processorクラスの実装を見てみた。http:…

JavaBeansのプロパティ名とGetter/Setter名

JavaBeansのプロパティ名とGetter/Setter名の対応について、何となくは知っていたがきちんと調べてたことがなかったので調べてみた。The JavaBeans 1.01 specificationまずプロパティ名からGetter/Setter名を生成する際のルールについて。これは「8.3 Design…

ぶり1.0.0+S2.3

ぶり1.0.0はSeasar2.4との組み合わせで動作するが、Seasar2.3ベースのフレームワーク上でぶりを使いたいという話を受け、ぶりがSeasar2.3との組み合わせで動作するかを調査した。動くらしいとは聞いていたので多分動くかなと思い調査。ぶり1.0.0をsvnからチ…

m2eclipseプラグインのWorkspace Resolution機能

m2eclipseプラグインの0.9.5系(sonatype.org開発版)にはWorkspace Resolution機能というのがあって、これを有効にすると、依存しているJARのプロジェクトがワークスペースに存在する場合、JARを暮らすパスに通す代わりにワークスペースをプロジェクト参照…

アノテーションオブジェクトの代入

アノテーションはAnnotatedElementに付与するものであって、それを取得するにはAnnotatedElement#getAnnotation()などを使うのが通常である。次のように、直接アノテーションを変数に代入したりはできない。 Anno anno = @Anno("hoehoe"); // ... NG ところ…

HttpServletRequest#getRequestURL()とforward

Javadocによると、HttpServletRequest#getRequestURL()は クライアントが要求を作成するために使用した URL を再構築します。- JavaTM 2 Platform, Enterprise Edition, v 1.3.1 API 仕様 となっているので、常にリクエストURLを返すのかと思いきや、forward…

拡張for文でできそうでできないこと

拡張for文でできそうでできないこと。 List<String> list = ...; String str = null; for (str: list) { ... } これができないので、for中でなんらかの条件を満たす値をlistから見つける処理を書く場合等は、見つけた値を格納する別の変数を定義する必要がある。以下</string>…

型パラメータつき引数

ちょっと誤解していたので書いておく。 ArrayList<String> list = new ArrayList<String>(); で、list.getClass()が返すClassオブジェクトは型パラメータ(String)の情報を持たないが、 public void hoe(List<String> list) { } のhoeメソッドに対応するMethodオブジェクトは、型パ</string></string></string>…

Freemarkerの「??」演算子

Freemarkerでnullチェックをするための「??」演算子はfreemarker-2.3.6では使えなかった。2.3.9にバージョンアップしたところ使えた。

Boolean.TYPEとboolean.class

プリミティブ型に対応するラッパ型が持つ「TYPE」という定数はプリミティブ型のクラスを表す。 例えばBeoolean.TYPEはbooleanのクラス型を表すが、これはboolean.classと同じ。 System.out.println(boolean.class == Boolean.TYPE); → trueところで次のよう…

アノテーションオブジェクトの生成

アノテーションAnnoのオブジェクトは@Annoが付与されているクラスやメソッドに対応するClassやMethodオブジェクトについてAnnotatedElement#getAnnotation(Anno.class)を呼び出すことで取得できるが、新たに生成したいことがある(かもしれない)。そこでい…

throw null

なんとなく気になったので試してみた。 public void test() { RuntimeException ex = null; throw ex; } 実行すると「throw ex」のところでNPE。当たり前と言えば当たり前か。

いまさらdouble-checked locking問題

友人に聞かれたので、ちょっとあいまいになっていた記憶を呼び覚ますためにdouble-checked lockingについて調査。以下のページにまとめられていた。 http://blogs.wankuma.com/nagise/archive/2007/08/24/91598.aspx 要約: JDK1.5からはメモリモデルが変更…

Maven Integration for Eclipse

いわゆるm2eclipseプラグイン。久々に見てみたら状況がいろいろ変わっていた。まずEclipseのUpdate SiteのURLが変わっていた。 (旧)http://m2eclipse.codehaus.org/update/ (新)http://m2eclipse.sonatype.org/update/ バージョンも、春くらいの時点では…

Tomcatの自動デプロイ機構

Tomcat(5.5。6も多分そう)の自動デプロイ機構は、 Tomcatの稼働中にWARが更新されると、WARに対応するディレクトリが存在してもそれを自動的に削除し、WARを再展開する。 Tomcatを停止した状態でWARを更新してTomcatを起動した場合は、WARに対応するディレ…

Tomcatのデフォルトのエラー画面の差し替え

Tomcatのデフォルトのエラー画面を差し替えるには、TOMCAT_HOME/conf/web.xmlにタグを書くのが簡単。 <error-page> <error-code>404</error-code> <location>/error/404.html</location> </error-page> ここで注意すべきは、locationの値は存在するコンテキストについてはそのコンテキスト相対パス、存在しないコンテキストについては…

Tomcatののの参照方法

Tomcat5.5のserver.xmlのセクションに例えば以下のように書いたの値をWebアプリケーションから参照する方法。 <Environment name="simpleValue" type="java.lang.Integer" value="30" /> Webアプリケーションのweb.xmlに <resource-env-ref> <resource-env-ref-name>simpleValue</resource-env-ref-name> <resource-env-ref-type>java.lang.Integer</resource-env-ref-type> </resource-env-ref></environment>