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();
		} 
	}
}
相关文章
相关标签/搜索