(转)Field getField(String name)与Field getDeclaredField(String name)的区别

本文通过一个具体的Java子类继承父类的例子,详细介绍了如何使用Java反射机制获取类成员变量的过程。对比了getField与getDeclaredField方法的区别,前者可以获取所有public成员变量,包括继承自父类的;后者只能获取当前类中声明的成员变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Field getField(String name)返回已加载类声明的所有public成员变量的Field对象,包括从父类继承过来的成员变量,参数name指定成员变量的名称

而Field getDeclaredField(String name)不能获取从父类那继承过来的成员变量

***********************************************

1 package cn.com.vo;
2
3 public class Father {
4 public String name="父亲";
5
6 public String sex="";
7
8 public String getName() {
9 return name;
10 }
11
12 public void setName(String name) {
13 this.name = name;
14 }
15
16 public String getSex() {
17 return sex;
18 }
19
20 public void setSex(String sex) {
21 this.sex = sex;
22 }
23
24
25 }
26 +++++++++++++++++++++++++++++++++
27
28 package cn.com.vo;
29
30 public class Son extends Father{
31
32 //public String name;
33 public int age=20;
34
35
36 }
37 =========================================
38
39 package cn.com.vo;
40
41 import java.lang.reflect.Constructor;
42 import java.lang.reflect.Field;
43 import java.lang.reflect.InvocationTargetException;
44 import java.lang.reflect.Method;
45
46 import cn.com.vo.UserVo;
47
48 public class TestReflect {
49
50 /**
51 * java反射机制
52 */
53 public static void main(String[] args) {
54 try {
55 //类的动态加载
56 Class c=Class.forName("cn.com.vo.Son");//方式一
57 Son vo=(Son)c.newInstance();
58
59 Field f=c.getField("name");
60 System.out.println(f.get(vo));
61
62
63 //注意:下段代码会报错,
64 /*Field f2=c.getDeclaredField("name");
65 System.out.println(f2.get(vo));*/
66
67 } catch (ClassNotFoundException e) {
68 // TODO Auto-generated catch block
69 e.printStackTrace();
70 } catch (SecurityException e) {
71 // TODO Auto-generated catch block
72 e.printStackTrace();
73 } catch (NoSuchFieldException e) {
74 // TODO Auto-generated catch block
75 e.printStackTrace();
76 } catch (InstantiationException e) {
77 // TODO Auto-generated catch block
78 e.printStackTrace();
79 } catch (IllegalAccessException e) {
80 // TODO Auto-generated catch block
81 e.printStackTrace();
82 }
83 }
84
85 }

转载于:https://www.cnblogs.com/keis/archive/2011/05/10/2042408.html

class Student{ private String name; private String number; public String sex; public int age; public Student(String name, String number, int age) { this.name = name; this.number = number; this.age = age; } public Student(String name){ this.name = name; } private Student(String name, String number){ this.name = name; this.number = number; } private void schooling(){ System.out.println(“去上学”); } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", number='" + number + '\'' + ", sex='" + sex + '\'' + ", age=" + age + '}'; } } package com.cqs.reflect_; import java.lang.reflect.Field; public class ReflectField { public static void main(String[] args) throws NoSuchFieldException { Class studentClass = Student.class; //测试getFields()函数 Field []studentFields = studentClass.getFields(); System.out.println(“通过getFields获取Student类所有公开属性”); for (Field field:studentFields) { System.out.println(“属性的类型为:”+field.getType()+“属性的名称为:”+field.getName()); } System.out.println();//换行 //测试getDeclaredFields()函数 Field []studentDeclaredFields = studentClass.getDeclaredFields(); System.out.println("通过getDeclaredFields获取Student类所有属性(包括私有,不包括继承)"); for (Field field :studentDeclaredFields) { System.out.println("属性的类型为:"+field.getType()+"\t属性的名称为:"+field.getName()); } System.out.println();//换行 //getField(String)函数 Field field = studentClass.getField("age"); System.out.println("通过getField(\"age\")获取公开属性age"); System.out.println("属性的类型为:"+field.getType()+"\t属性的名称为:"+field.getName()); System.out.println();//换行 //测试getDeclaredField(String)函数 Field DeclaredFiled = studentClass.getDeclaredField("name"); System.out.println("通过getDeclaredField(\"name\")获取私有属性name"); System.out.println("属性的类型为:"+DeclaredFiled.getType()+"\t属性的名称为:"+DeclaredFiled.getName()); } }上述代码运行结果为什么是通过getFields获取Student类所有公开属性 属性的类型为:class java.lang.String属性的名称为:sex 属性的类型为:int属性的名称为:age 通过getDeclaredFields获取Student类所有属性(包括私有,不包括继承) 属性的类型为:class java.lang.String 属性的名称为:name 属性的类型为:class java.lang.String 属性的名称为:number 属性的类型为:class java.lang.String 属性的名称为:sex 属性的类型为:int 属性的名称为:age 通过getField("age")获取公开属性age 属性的类型为:int 属性的名称为:age 通过getDeclaredField("name")获取私有属性name 属性的类型为:int 属性的名称为:age
07-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值