28-反射机制-05-反射机制(获取Class中的字段)

package bean;

public class Person {

	private int age;
	private String name;

	public Person() {
		super();
		System.out.println("...Person run...");

	}

	public Person(String name, int age) {
		super();
		this.age = age;
		this.name = name;
		System.out.println("...Person param run..." + this.name + ":"
				+ this.age);
	}

	public void show() {

		System.out.println(name + "...show run..." + age);

	}

	public void method() {

		System.out.println("...method run...");

	}

	public void paramMethod(String str, int num) {

		System.out.println("...paramMethod..." + str + ":" + num);

	}

	public static void staticMethod() {

		System.out.println("...staticMethod run...");

	}
}

========================分割线========================

/*
 * 【获取Class中的字段】
 * Class类内有如下特有方法:
 * 
 * (1)public Field getField(String name) throws NoSuchFieldException,SecurityException
 * 根据名字获取Class文件中的指定字段,【注意】这个方法可以获取父类的字段
 * 
 * (2)public Field[] getFields() throws SecurityException
 * 获取Class文件中所有公共字段
 * 
 * (3)public Field[] getDeclaredFields() throws SecurityException
 * 获取Class文件中所有字段,哪怕私有的也可以获取,【注意】这个方法只能获取本类的字段
 */

package demo;

import java.lang.reflect.Field;

public class Demo {

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

		getFieldDemo();
		
	}

	public static void getFieldDemo() throws Exception {
		
		Class clazz = Class.forName("bean.Person");//这里Person类与前一视频一样,可不重复记录到本子上
		
//		Field field = clazz.getField("age");//对应构造函数(1)
//		
//		System.out.println(field);//居然抛出NoSuchFieldException,即没有这个字段,因为Person类内age是private
		
		Field field = clazz.getDeclaredField("age");
		
//		System.out.println(field);//private int bean.Person.age
		
		//下面对获取到的字段进行操作,即设置和获取,也就是set和get方法
		
		Object obj = clazz.newInstance();
		
		field.set(obj, 89);
		Object o = field.get(obj);
//【注意】一般Person p = new Person,p.age=1;必须指定是p的age对应值为1,所以这里get方法需要指定对象
		System.out.println(o);//抛出IllegalAccessException,即无效的访问异常,因为在Person类中age是私有的
		
/**
 * 只需要利用Field父类AccessibleObject中的特有方法取消私有权限即可访问:
 * 		public void setAccessible(boolean flag) throws SecurityException
 * 只要在该方法参数内传入true即可取消权限
 * 
 * 所以在39与40行代码之间加上field.setAccessible(true)即可,最后发现输出o的值为0
 * 
 * 这个可以称为【暴力访问】
 */
		
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值