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