网站首页 > java教程 正文
通过反射可以得到字节码文件中的信息,比如字节码中的属性、方法、构造器等,是与类对应的。
今天学习属性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));
}
}
猜你喜欢
- 2024-10-12 java基础之反射,反射API的组成,反射机制的应用场景
- 2024-10-12 Java反射与反射优化(java反射与反射优化的区别)
- 2024-10-12 尚学堂讲有关Java反射的那些事(java反射如何通俗易懂理解)
- 2024-10-12 Java面试手册:反射(java面试反射机制)
- 2024-10-12 如何通过反射获得方法的真实参数名(以及扩展研究)
- 2024-10-12 Java中的反射使用(java 反射使用)
- 2024-10-12 Java面试技术,这31个反射问题你都会嘛?(有答案)
- 2024-10-12 Java反射机制详解(java中的反射机制)
- 2024-10-12 测试开发必须掌握的知识点:Java反射
- 2024-10-12 Java反射机制(Java反射机制主要提供了以下哪些功能)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)