Java reflect-Java 反射

1、經過reflect 實例化對象

按照老習慣,先上代碼
java

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:this

A 構造方法:0spa

Normal -> 2code

A 構造方法:10orm

Reflect -> 25對象

2、經過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;
    }
}

測試get

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();
		} 
	}
}
相關文章
相關標籤/搜索