如图,当我访问类中的字段的时候,getDeclaredField方法总会报一个NoSuchFieldException,我已经改成了public声明,但还是会出现这个问题,请问应该怎么解决?JAVA版本用的是Java13
Field[] allFields = clazz.getDeclaredFields();
是不是返回参数问题??
**Class cls=p.getClass();
Field field1=cls.getDeclaredField("name");
System.out.println(field1);
这样可以把名字输出,
getDeclaredField()方法里是属性的名字,并且是字符串的格式(所以外面需要引号)
而且使用这个方法时需要抛出异常,或者try,catch一下
**
另外,下面是我总结的反射的一些知识点,希望对你有帮助。
Reflect : 反射,映射
类加载到内存中:将类的信息读取到内存中去(class文件读到内存中去)
(一)
创建对象的两个不同时机:
(1)编译时创建对象:new Person(""); (弊端:对象改变时需要不断修改源代码)
(2)运行时创建对象:首先要获取class文件的信息 ,java中提供了一个类Class类
(二)
Class类获得对象三种方法:
(1)Class clazz1=Class.forName(""); ""里面放的是包名.类名(通过对应java文件下的文件右键copyQualifiedName得到)
(2)Class clazz2=类名.class;
(3)Class clazz3=对象名.getClass();
注:clazz1 clazz2 clazz3对象都是同一个对象(因为读取的都是同一个类的相同的class文件)
(三)
Class类的对象获取构造方法:
Class对象名.getConstructors():只能得public修饰的所有构造方法
Class对象名.getDelcaredConstructors():得到所有构造方法
Class对象名.getConstructors():只能得到public修饰的一个构造方法 Class对象名.getDelcaredConstructors():得到一个构造方法
(四)
通过构造方法(有参或无参)可以创建其相对应的对象实例。
Object obj=构造方法变量名.newInstance();
(五)
Class类的对象获取普通方法(同构造方法):
Class对象名.getMethods():只能得public修饰的所有方法
Class对象名.getDelcaredMethods():得到所有方法
Class对象名.getMethod():能得到public修饰的一个方法
Class对象名.getDeclaredMethod():得到一个方法
(六)
Class类的对象获取属性(同构造方法),但一般实体类的属性都为私有变量,且多为一次取一个,故getDeclaredField(Field field)最为常用。
(七)
以reflect包下的拥有姓名和年龄属性的Person实体类为例,
例1:
运行时(加载类文件的方式)创建Person对象
Class clazz=Class.forName("reflect.Person");//创建Class类对象
Constructor c=clazz.getConstructor();//创建无参构造变量
Object obj=c.newInstance();//用该无参构造变量创建Person对象实例
例2:
Class clazz=Class.forName("reflect.Person");//创建Class类对象
Constructor c=clazz.getConstructor(String.class,int.class);
//创建有参构造变量
Object obj=c.newInstance("张三",20);
//用该有参构造变量创建Person对象实例
例3:
运行时(加载类文件的方式)通过无参构造创建Person对象并调用其display方法(公有无参方法),设定姓名属性name为”张三”(私有属性)
Class clazz=Class.forName("reflect.Person");//创建Class类对象
Constructor c=clazz.getConstructor();//创建无参构造对象
Object obj=c.newInstance();//用该无参构造对象创建Person对象实例
Method m=clazz.getMethod("display", null);//创建方法对象
m.invoke(obj);//执行方法
Field field=clazz.getDeclaredField("name");//创建私有变量对象
field.setAccessible(true);//私有变量设定取出或方法执行时需要得到权限,setAccessible(true);使其得到权限。
field.set(obj, "张三");//设定这个属性
把异常抛出去或者捕获了就好了
这个是有异常,你try-catch一下或者抛出去就ok,你要用反射给这个字段赋值的话直接拿到这个field.set就好了