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