VM引数で変数を書き換えるテスト

リフレクションを使ってオブジェクトのフィールドを書き換えてみる。
publicで先頭が大文字のint, boolean, Stringのフィールド(コーディング規約違反だけど気にしない)にのみ対応。

Test.java

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

public class Test {
	public static void main(String[] args) throws Exception {
		Test test = new Test();
		replaceField(test);
		System.out.println("test.TEST_INT = " + test.TEST_INT);
		System.out.println("Test.TEST_STATIC_BOOLEAN = " + Test.TEST_STATIC_BOOLEAN);
		System.out.println("test.TEST_STRING = " + test.TEST_STRING);
		System.out.println("test.TEST_PROTECTED_INT = " + test.TEST_PROTECTED_INT);
	}
	public int TEST_INT = 123;
	public static boolean TEST_STATIC_BOOLEAN = true;
	public String TEST_STRING = "ほげほげ";
	protected int TEST_PROTECTED_INT = 111;
	Test() {
	}
	public static void replaceField(Object obj) {
		// publicで先頭大文字の変数を抽出
		// System.getPropertyから値を読み込んでobjの変数にセット
		Class<?> c = obj.getClass();
		Field[] fields = c.getFields();
		for (Field field : fields) {
			int mod = field.getModifiers();
			if (!Modifier.isPublic(mod)) {
				continue;
			}
			
			Class<?> type = field.getType();
			String fieldName = field.getName();
			if (!Character.isUpperCase(fieldName.charAt(0))) {
				continue;
			}
			
			String typeName = type.getSimpleName();
			
			String property = System.getProperty(fieldName);
			if (property == null) {
				continue;
			}
			try {
				if (typeName.equals("int")) {
					int value = Integer.parseInt(property);
					field.setInt(obj, value);
				} else if (typeName.equals("boolean")) {
					boolean value = Boolean.parseBoolean(property);
					field.setBoolean(obj, value);
				} else if (typeName.equals("String")) {
					field.set(obj, property);
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

VM引数

-DTEST_INT=456
-DTEST_STATIC_BOOLEAN=false
-DTEST_STRING=てすと
-DTEST_PROTECTED_INT=999

結果

test.TEST_INT = 456
Test.TEST_STATIC_BOOLEAN = false
test.TEST_STRING = てすと
test.TEST_PROTECTED_INT = 111