JAVA反射メカニズムFieldクラスを反射してオブジェクトクラスの文字列値を取得および変更する


ReflecClassPoint01.java

 

package com.sg.reflex;

public class ReflecClassPoint01 {
    private int x;
    public int y ;
   
    public String str1 = "ball";
    public String str2 = "basketball";
    public String str3 = "itcast";
   
    public ReflecClassPoint01() {
        super();
    }

    public ReflecClassPoint01(int x, int y) {
        this.x = x;
        this.y = y;
    }

    @Override
    public String toString() {
        return str1 + ":" + str2 + ":" + str3 ;
    }
   
}

 

 
 
テストjava
 
 
package com.sg.reflex.test;

import java.lang.reflect.Field;

import com.sg.reflex.ReflecClassPoint01;

public class ReflecClassPointTest {
    public static void main(String[] args) throws Exception{

        ReflecClassPoint01 p = new ReflecClassPoint01(3, 5);
        Field fieldY = p.getClass().getField("y");
        //fieldY  ?
        System.out.println(fieldY.get(p));
       
        Field fieldX = p.getClass().getDeclaredField("x");
        //  accessible  
        fieldX.setAccessible(true);
        System.out.println(fieldX.get(p));
       
       
        chageStringValue(p);
        System.out.println(p);
    }

    private static void chageStringValue(Object obj) throws Exception{
        Field[] fields = obj.getClass().getFields();
       
        for (Field field : fields) {
            //field.getType();
            // ==   String 
            if (field.getType() == String.class) {
                String oldValue = (String) field.get(obj);
                // b B
                String newValue = oldValue.replace("b","B");
               
                field.set(obj, newValue);
               
            }
        }
    }
   
}