private なフィールドから値を取得/設定する

たまにはブログを書かないと、周りの人から「この人生きてるの…?」という疑問を持たれかねないので無理矢理エントリを上げてみる。
とはいえ、最近忙しくてPHP書けてないのでお仕事してるJavaのコードを貼り付けてみる。
private なフィールドから値を取得・設定するサンプル。

package jp.devworks.sample;

import java.lang.reflect.Field;

public class FieldUtil {

	/**
	 * フィールドの値を取得します。<br />
	 * public/private おかまいなしです。 getter/setter なくても取得可能
	 * 
	 * @param obj
	 *            取得対象オブジェクト
	 * @param name
	 *            取得対象フィールド名
	 * @return フィールドの値
	 */
	public static Object get(Object obj, String name) {
		if (obj == null || name == null) {
			return null;
		}
		Field f = null;
		Object result = null;
		try {
			f = obj.getClass().getDeclaredField(name);
			f.setAccessible(true);
			result = f.get(obj);
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		return result;
	}

	/**
	 * フィールドの値を設定します。<br />
	 * public/private おかまいなしです。 getter/setter なくても設定可能
	 * 
	 * @param obj
	 *            設定対象オブジェクト
	 * @param name
	 *            設定対象フィールド名
	 * @param value
	 *            設定する値
	 */
	public static void put(Object obj, String name, Object value) {
		Field f = null;
		try {
			f = obj.getClass().getDeclaredField(name);
			f.setAccessible(true);
			f.set(obj, value);
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
	}
}

こんなの使うとカプセル化が台無しなので、乱用はダメ、ぜったい。
こういうの書いてると「Javaは便利だなぁ」と思います。

http://www.pasonatech.co.jp/10th/event/dev_fest/fukuoka.jsp があるので飲み会とかしませんか

全てタイトルで説明しちゃったわけなのですが、もうちょっと詳しく。
1/31 で福岡でこんなイベントがあります。

面白そうなので当日は僕も見に行こうと思ってます。で、やっぱりお祭りの前には飲み会だよねということで橋本さんが wiki を用意してくれました。

参加希望の方は 1/27 18:00 まで wiki を編集しちゃえばいいと思います。
当日登壇する方も参加されるので、イベントに来る人にはとても有意義な飲み会になるのではないでしょうか。あと、イベントには都合がつかなくて行けないけどお酒が飲みたい方もくるといいんじゃないかと思います。きっと楽しいです。

今年もよろしくお願い致します

少し遅くなりましたが明けましておめでとうございます。今年もよろしくお願い致します。
今年の目標は

  • MoteGram の完成
  • MoteGram での実績作り
  • できるだけ人に会う

にしたいと思います。週末あたりにお酒のみたいなぁ。
話は変わって年末のことですがFWWのサイトのリニューアル作業をしました。かっちょいいのでぜひ見て下さい。
…実は動的な部分は完成しておりません。関係者の皆様ご迷惑をおかけしました。引き続きがんばります。

あるぇー?

最近になって仕様が変わったのかな? 知らなかったの僕だけ?

package jp.devworks.sample;

public class StringCompare {

	public static void main(String[] args) {
		String s = "01";
		String s2 = "01";
		
		System.out.println(s == s2);
	}
}

false が返ってくるとおもったら true が返ってくる。「こんな実装しちゃだめだよー」って言おうとしてサンプルコード書いたら結果がこうなので驚いてる。
あ、あるぇー?
(追記)
JDK 1.5.09 と 1.6.07 で試した。結果は同じ。 true が返る。
(追記その2)
id:nowokay さんが教えてくれました。

クラスローダーが同じならリテラルは共有されます。
やりたかったら
String s = "0";
String s2 = s + 1;
s = s + 1;
System.out.println(s == s2);
とか

あるぇー? - devworks

なるほど。やってみた

package jp.devworks.sample;

public class StringCompare {

	public static void main(String[] args) {
		String s = "01";
		String s2 = s + 1;
		s = s + 1;
		System.out.println(s == s2);
	}
}

false が返ってくる。ちょっと賢くなりました。あざっす!

MoteGram メモ

コントローラー基本クラス

View と Model については考え中…。
その他作るもの

あと、ジェネレーターも考えないとな…。

PHPAnnotation できたよ

というわけで今週取り組んでいた PHP で Annotation の作業が1段落ついたので codecheck.in にコミットしました。よかったら見てくださいな。

使い方はこんな感じ。

<?php
class SampleAction {

    /**
     * Required アノテーションがついてるので
     * このフィールドは必須チェックが実行されます
     * @Required
     * @var string
     */
    public $name;

    /**
     * アクションを実行します
     * Validation を実行します。Validation が失敗した
     * 場合は hoge に遷移します
     * @Execute(input=hoge)
     */
    public function validateExecute() {
    }
    
    /**
     * アクションを実行します
     * Validation は実行しません
     * @Execute(validate=false)
     */
    public function notValidate() {
        ;
    }
}

簡単な解説。まず $name に Required アノテーションがついています。なので必須チェックされます。Validation は function 単位の実行が可能で function には Execute アノテーションをつけます。
validateExecute は Validation を行い、検証に失敗した場合は input で指定された値を参照して画面遷移します(未実装)。Execute アノテーションの validate=false にした場合、 Validation は実行されません。notValidate function がこの例です。
明日からはフロントコントローラーの設計を始めます。
追記
codecheck.in は実行環境つきです。素晴らしい。
なので、早速実行してみました。

<?php
include_once 'RequestProcessor.php';
include 'action/SampleAction.php';

$action = new SampleAction();
$method = 'validateExecute';

$processor = new RequestProcessor();
$valid = $processor->processValidate($action, $method);

print_r($valid);

$method = 'notValidate';
$valid = $processor->processValidate($action, $method);

if ($valid == null) {
    echo 'valid is null';
}
?>

PHPAnnotation
実行できた! やった!

OSC 2008 Fukuoka に行ってきました

オープンソースカンファレンス2008 Fukuoka - みんなきないよ!に行ってきたよ。ブログを書くまでが OSC なのでみんな書くといい。
以下感想。

  • CubbyでRESTfulなWebアプリを
    • 腰痛で家でもんどりうっていたら、間に合いませんでした。
    • id:agt すいません! すいません!
  • AIPが目指す「これからのIT人材」育成 〜AIPと天神・大名WiFiの活用法〜
    • 途中から。杉山さんは相変わらずプレゼンが上手いなぁ
    • 僕は AIP コミュニティは大好きで、AIP には ?? って思っていることがわかった
  • 昼食
    • id:agt,@takason,id:re_shikajiro,@debility@konya…とあと一人お名前忘れましたすいません。と楽しくランチしました。Adobe AIRJavaFX について話しました。個人的には JavaFX はアピールする層を間違ってるんじゃないか、と思います。もっとデザイナにアピールしたほうがいいんじゃないかな。
  • XOOPSの可能性とオープンソースCMSの今後について
    • 初心者向け。途中退席
    • AIP のブースでぼーっとしてたら吉岡さんにお会いすることができた!
  • 仲間同士のコミュニティサイト(SNSエンジン、OpenPNE)の紹介
    • 初心者向け。途中退席
  • 【特別企画】勉強会勉強会(2コマ連続)
    • PHP in Fukuoka の人として LT とパネルディスカッションに参加しました。横に並んでる人たちが顔見知りばかりなので緊張もせずお話できてよかったです。
    • Ustream で録画されているみたいなので興味のある方はごらんください。動画

で、腰痛のため懇親会を泣く泣くキャンセルし不貞寝して MoteGram のコードを書いていたらこんな時間になりました。参加された皆様、ありがとうございました、そしてお疲れ様でした。