反射 getDeclaredField 报错java.lang.NoSuchFieldException

  今日需求上除了需要导出excel,方便运营的统计与数据整理,对于导出,当然是做了无数个了,今日则主要说一个小细节,关于getDeclaredField的知识。

先说一下场景使用:

  1. 需要将信息和所需字段一一对应,然后放入excel,并找位置存储;
  2. 将路径存储到服务器,便于调用方直接读取;

  使用getDeclaredField则是对于步骤一的存值出现了问题。为什么会出现问题呢?因为自己考虑不周到,导出的字段是多余数据库存储字段的,需要自己再另外增加统计啥的,所以采用了一个实体继承的方式,对于平时的传值是没有任何问题的。但是在导出取值的时候却真是遇到了问题啊。
  首先明白两点:
1、继承的概念
  继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。但是说到底还是同属于两个类的。但是说到最终,依旧还是同属于两个类的。
2、反射的概念
  JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
导出遇到的问题截图:
在这里插入图片描述
导出遇到的文字描述:

java.lang.NoSuchFieldException: id

  这就是因为自己的id属性其实是在继承的父类里边的。接下来通过一个小demo,深刻感受一下。

/**
 * @Author:HuoYaJing
 * @Description: 动物父类
 * @Date: Create in 16:14 2020-06-16
 */
public class Animal {
	/**
	 * 年龄
	 */
	private int age;
	/**
	 * 性别
	 */
	private boolean sex;

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public boolean isSex() {
		return sex;
	}

	public void setSex(boolean sex) {
		this.sex = sex;
	}
}
/**
 * @Author:HuoYaJing
 * @Description:Dog子类
 * @Date: Create in 16:26 2020-06-16
 */
public class Dog extends Animal {
	/**
	 * 颜色
	 */
	private String furColor;

	public String getFurColor() {
		return furColor;
	}

	public void setFurColor(String furColor) {
		this.furColor = furColor;
	}
}
public static void main(String[] args) {
		try {
			//调用父类的属性
			Field field=Dog.class.getDeclaredField("age");
		} catch (NoSuchFieldException e) {
			e.printStackTrace();
		}
	}

看结果:
在这里插入图片描述

public static void main(String[] args) {
		try {
			//调用子类自身的属性
			Field field=Dog.class.getDeclaredField("furColor");
		} catch (NoSuchFieldException e) {
			e.printStackTrace();
		}
	}

看结果:
在这里插入图片描述
  getDeclaredFiled 仅能获取类本身的属性成员(包括私有、共有、保护) ,对于父类信息是没办法返回的。那么我就真的想获取父类属性,该如何处理呢?通过getSuperclass的之后再通过getDeclaredFiled获取即可。

public static void main(String[] args) {
		try {
			//通过getSuperclass获取父类属性
			Field field=Dog.class.getSuperclass().getDeclaredField("age");
			System.out.println(field.getName());
		} catch (NoSuchFieldException e) {
			e.printStackTrace();
		}
	}

时间:2021年08月25日20:44:55

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值