今日需求上除了需要导出excel,方便运营的统计与数据整理,对于导出,当然是做了无数个了,今日则主要说一个小细节,关于getDeclaredField的知识。
先说一下场景使用:
- 需要将信息和所需字段一一对应,然后放入excel,并找位置存储;
- 将路径存储到服务器,便于调用方直接读取;
使用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