java反射机制通过代码示例解析

java的反射机制通过语言描述不容易理解,今天写了一段代码试验,效果不错,分享给大家
</pre><pre name="code" class="java">import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

/**
 *
 * @author wq 2015.08.25
 *
 */
public class Account {
	public int accountId;
	public String accountName;
	private String accountPwd;
	
	public Account(int accountId, String accountName, String accountPwd){
		this.accountId = accountId;
		this.accountName = accountName;
		this.accountPwd = accountPwd;
	}
	
	/**
	 * 获取对象的公共属性
	 * @param owner 传入的对象
	 * @param fieldName 要获取属性的名称
	 * @return property 返回获得的属性
	 * @throws Exception
	 */
	public static Object getProperty(Object owner,String fieldName) throws Exception{
		//获得保存传入对象的运行时类型标识的类对象,这个对象保存了类的所有属性,每一个属性都是一个Field类型的对象
		Class ownerClass = owner.getClass();
		
		//Field类是java反射机制特有的,必须引入包java.lang.reflect.Field
		//getField()只能获得到类的公共属性,获得到的属性是一个Field类型的对象
		//Field field = ownerClass.getField(fieldName);
		
		//getDeclaredField可以获取类的任何类型的属性
		//Field privateField = ownerClass.getDeclaredField(fieldName);
		//privateField.setAccessible(true);
		
		//无论属性的修饰符是什么类型,先获取到属性对象
		Field field = ownerClass.getDeclaredField(fieldName);
		//定义接收属性的对象
		Object property;
		
		//判断属性的修饰符类型,公共的可以直接获取属性值,私有的先设置允许再获取值
		//getModifiers()获取属性的修饰符,这个方法返回值是int型。可以用int型直接进行对比,转换成String型更为直观
		if(Modifier.toString(field.getModifiers()).equals("public")){
			//通过类的属性字段对象获得单个类对象的属性
			property = field.get(owner);
		}else{
			field.setAccessible(true);
			property = field.get(owner);
		}
		
		return property;
	}
	
	public static void main(String argus[]){
		//创建一个对象
		Account account = new Account(123,"bijie","123");
		System.out.println("直接通过对象获得的属性值为:  "+account.accountName);
		try {
			System.out.println("通过封装的方法获得的类的私有字段值为:"+getProperty(account,"accountPwd"));
		} catch (Exception e1) {
			e1.printStackTrace();
		}
		
		try {
			System.out.println("获得到的类的属性对象为:  "+account.getClass().getField("accountName"));
			try {
				System.out.println("通过类的属性对象获得到的类对象的属性值为:  "+account.getClass().getField("accountName").get(account));
			} catch (IllegalArgumentException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			}
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			e.printStackTrace();
		}
		
		
	}

}
运行结果为:

 
<img src="https://img-blog.csdn.net/20150825145106269?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
注:
在判断属性的修饰符时,可以用程序中转换成字符串的方法,也可以用getModifiers()返回的整数进行判断。
用getModifiers()方法获得变量的修饰符,返回整数值,可以用二进制计算方法计算出各修饰符对应的值:
修饰符:native transient volatile synchronized final static protected private public
对应值:  0       0         0         0          0     0       0         0      0
例:
选择哪一位的修饰符就把对应为的对应值设为1
获得的修饰符为:public               则getModifiers()获得的结果为:1  用对应值计算:000000001 = 1
      修饰符为:public static        则getModifiers()获得的结果为:9  用对应值计算:000001001 = 9
      修饰符为:private static        则getModifiers()获得的结果为:10  用对应值计算:000001010 = 10
      修饰符为:public static final     则getModifiers()获得的结果为:25  用对应值计算:000011001 = 25 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值