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();
		} 
	}
}


你可能感兴趣的:(java,反射,setAccessible,reflect-Java)