java之反射(2)属性field
#头条创作挑战赛#
通过反射可以得到字节码文件中的信息,比如字节码中的属性、方法、构造器等,是与类对应的。
今天学习属性field的一些api。设置一个User类,内容如下:public class User { public int num; private double hight; protected String cname; static boolean sex; private static int age; }一、反射属性
先获取字节码文件:Class cUser = Class.forName("org.example.dao.User");
getFields获取公开的属性,即带有public的 Field[] fields = cUser.getFields(); for (Field f : fields) { System.out.println(f); } 输出:public int org.example.dao.User.num
getDeclaredFields()获取所有的属性,无论是私有的还是公开的还是受保护的。返回的是一个field的数组。 Field[] declaredFields = cUser.getDeclaredFields(); for (Field item : declaredFields) { System.out.println("获取属性全名:" + item); }
输出结果:获取属性全名:public int org.example.dao.User.num
获取属性全名:private double org.example.dao.User.hight
获取属性全名:protected java.lang.String org.example.dao.User.cname
获取属性全名:static boolean org.example.dao.User.sex
获取属性全名:private static int org.example.dao.User.age
获取属性全名:float org.example.dao.User.kg
如果你不想输出这么长的名字,可以用getName()获取短名。 Field[] declaredFields = cUser.getDeclaredFields(); for (Field item : declaredFields) { System.out.println("获取属性简名:" + item.getName()); }
输出结果:获取属性简名:num
获取属性简名:hight
获取属性简名:cname
获取属性简名:sex
获取属性简名:age
获取属性简名:kg
获取类型名 Field[] declaredFields = cUser.getDeclaredFields(); for (Field item : declaredFields) { System.out.println("获取属性类型:" + item.getType()); }
输出结果:获取属性类型:int
获取属性类型:double
获取属性类型:class java.lang.String
获取属性类型:boolean
获取属性类型:int
获取属性类型:float
获取属性修饰符 Field[] declaredFields = cUser.getDeclaredFields(); for (Field item : declaredFields) { System.out.println("获取修饰符编号:" + item.getModifiers()); }
输出结果:获取修饰符编号:1 获取修饰符编号:2 获取修饰符编号:4 获取修饰符编号:8 获取修饰符编号:10 获取修饰符编号:0
输出的是一堆修饰符编号,什么都不加 是0 , public 是1 ,private 是 2 ,protected 是 4,static 是 8 ,final 是 16; 可以用Modifier.toString()进行转换。 Field[] declaredFields = cUser.getDeclaredFields(); for (Field item : declaredFields) { System.out.println("获取修饰符名字:" + Modifier.toString(item.getModifiers())); }
输出结果:获取修饰符名字:public
获取修饰符名字:private
获取修饰符名字:protected
获取修饰符名字:static
获取修饰符名字:private static
获取修饰符名字:
二、类属性的获取:Class cUser = Class.forName("org.example.dao.User"); System.out.println("获取字节码文件全名:" + cUser.getName()); System.out.println("获取字节码文件简单名:" + cUser.getSimpleName()); System.out.println("获取字节码文件修饰符:" + Modifier.toString(cUser.getModifiers()));
结果:获取字节码文件全名:org.example.dao.User
获取字节码文件简单名:User
获取字节码文件修饰符:public
解析:
getName():是获取类的全限定名
getSimpleName():获取类的简单名字
三、以实例对象的方式设置属性值
用newInstance创建实例对象,public class Client { public static void main(String[] args) throws Exception { Class cUser = Class.forName("org.example.dao.User"); // User obj =(User) cUser.newInstance(); Object obj = cUser.newInstance(); } }
用getDeclaredField获取单个的属性,这里不是getDeclaredFields哈,少了个s。public class Client { public static void main(String[] args) throws Exception { Class cUser = Class.forName("org.example.dao.User"); // User obj =(User) cUser.newInstance(); Object obj = cUser.newInstance(); Field hight = cUser.getDeclaredField("hight"); } }
获取到属性后,给hight赋值,用hight.set(obj, 178);
hight:是要赋值的属性。
set:设置
obj:是给那个对象赋值
178:要设的属性值public class Client { public static void main(String[] args) throws Exception { Class cUser = Class.forName("org.example.dao.User"); // User obj =(User) cUser.newInstance(); Object obj = cUser.newInstance(); Field hight = cUser.getDeclaredField("hight"); hight.set(obj, 178); } }
此时运行一下,发现报错了:
这是因为hight属性是一个私有的,不能设置属性值。
怎么办呢?可以用setAccessible(true);进行强制赋值。public class Client { public static void main(String[] args) throws Exception { Class cUser = Class.forName("org.example.dao.User"); // User obj =(User) cUser.newInstance(); Object obj = cUser.newInstance(); Field hight = cUser.getDeclaredField("hight"); hight.setAccessible(true); hight.set(obj, 178); } }
强制赋值之后就可以了,那我们怎么查看赋值的结果呢?
用hight.get(obj)查看结果:
hight:是要查看的属性
get:查询
obj:查询那个对象的属性值。public class Client { public static void main(String[] args) throws Exception { Class cUser = Class.forName("org.example.dao.User"); // User obj =(User) cUser.newInstance(); Object obj = cUser.newInstance(); Field hight = cUser.getDeclaredField("hight"); System.out.println(hight.getName()); hight.setAccessible(true); hight.set(obj, 178); System.out.println(hight.get(obj)); } }