Java reflect-Java反射


一、reflectによるオブジェクトのインスタンス化
古い習慣に従って,まずコードをつける
package com.yuan.refletion;

class A {
	public int count;
    public int getCount() {
		return count;
	}
	public void setCount(int count) {
		this.count = count;
	}
	public A(int start) {
        count = start;
        System.out.println("A     :"+count);
    }
    public void increase(int step) {
        count = count + step;
    }
}

Java反射のテスト
package com.yuan.refletion;

import java.lang.reflect.*;

class B {
	public static void main(String args[]) {
		A Aa = new A(0); //    
		Aa.increase(2);
		System.out.println("Normal -> " + Aa.getCount());
		try {
		    Constructor<A> constructor = A.class.getConstructor(int.class); //      
		    A AReflect =(A)constructor.newInstance(10); //    
		    Method method = A.class.getMethod("increase", int.class);  //    
		    method.invoke(AReflect, 15); //    
		    Field field = A.class.getField("count"); //   
		    System.out.println("Reflect -> " + field.getInt(AReflect)); //     
		} catch (Exception e) { 
		    e.printStackTrace();
		} 
	}
}

output:
A構築方法:0
Normal -> 2
A構造方法:10
Reflect -> 25
二、setAccessable方法で権限を越えてアクセスクラス内のプライベート変数をチェックする
package com.yuan.refletion;

class A {
	private int count;//       
        public int getCount() {
		return count;
	}
	public void setCount(int count) {
		this.count = count;
	}
	public A(int start) {
        count = start;
        System.out.println("A     :"+count);
    }
    public void increase(int step) {
        count = count + step;
    }
}

テスト
package com.yuan.refletion;
import java.lang.reflect.*;
class B {
	public static void main(String args[]) {
		A Aa = new A(0); //    
		Aa.increase(2);
		System.out.println("Normal -> " + Aa.getCount());
		try {
		    Constructor<A> constructor = A.class.getConstructor(int.class); //      
		    A AReflect =(A)constructor.newInstance(10); //    
		    Method method = A.class.getMethod("increase", int.class);  //    
		    method.invoke(AReflect, 15); //    
		    
		    Field field =A.class.getDeclaredField("count");//              
		    //A.class.getField("count"); //   
		    field.setAccessible(true);//         
		    System.out.println("Reflect -> " + field.getInt(AReflect)); //     
		} catch (Exception e) { 
		    e.printStackTrace();
		} 
	}
}