[求助] - 子类调用父类方法,通过反射获取父类属性,菜鸟烈日跪求.

pk1 2014-06-28 05:39:22
父类中有如下代码:

public String getKeyToValue() {
// reflection to get all the attributes
Field[] fields = this.getClass().getDeclaredFields();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < fields.length; i++) {
Field f = fields[i];
try {
String value = f.get(this).toString().trim();
if (null != f && !value.equals("")) {
sb.append(" ").append(f.getName()).append("=\"").append(
value).append("\"");
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return sb.toString();
}


我想在子类中,调用该方法获取如下格式的属性:
key="value" key2="value2" 的格式串.

但现在的问题是,在子类中调用该方法时候, this.getClass() 获得的是子类的Class对象,再调用getDeclaredFields()
方法,拿不到父类的属性.

如果使用 this.getClass().getSupperClass()可以获得父类的Class对象,也可以获取到父类声明的属性.
但是 获取该对象的值的时候f.get(this) ,就出现了空指针.

此外,当然有其他方法可以实现该功能,我只是想通过反射获取,这样可以不用关心属性个数.
谢谢各位了.
...全文
509 5 打赏 收藏 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
pk1 2014-06-30
  • 打赏
  • 举报
回复
引用 3 楼 u012954898 的回复:
我根据你的意思大概模拟了一下 不知道是不是你想要的 没有空指针 但是这样只能得到父类的属性 class Father { String s = "afa"; int i = 10; public String getKeyToValue() { // reflection to get all the attributes Class c = this.getClass().getSuperclass(); Field[] fields = c.getDeclaredFields(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < fields.length; i++) { Field f = fields[i]; try { String value = f.get(this).toString().trim(); if (null != f && !value.equals("")) { sb.append(" ").append(f.getName()).append("=\"") .append(value).append("\""); } } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } return sb.toString(); } } public class Child extends Father{ String s = "safsfsfs"; public static void main(String[] args) { String s = new Child().getKeyToValue(); System.out.println("ada"); System.out.println(s); } }
你是正确的,我忘记判断非空了,所以得出的是NULL,非常感谢.
双龙寇仲 2014-06-30
  • 打赏
  • 举报
回复
getDeclaredFields()是获取自身类的属性,getFields()会把继承的属性一起获取,看情况用
  • 打赏
  • 举报
回复
我根据你的意思大概模拟了一下 不知道是不是你想要的 没有空指针
但是这样只能得到父类的属性
class Father {

String s = "afa";

int i = 10;

public String getKeyToValue() { // reflection to get all the attributes
Class c = this.getClass().getSuperclass();
Field[] fields = c.getDeclaredFields();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < fields.length; i++) {
Field f = fields[i];
try {
String value = f.get(this).toString().trim();
if (null != f && !value.equals("")) {
sb.append(" ").append(f.getName()).append("=\"")
.append(value).append("\"");
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return sb.toString();
}


}

public class Child extends Father{

String s = "safsfsfs";

public static void main(String[] args) {
String s = new Child().getKeyToValue();
System.out.println("ada");
System.out.println(s);
}

}
pk1 2014-06-28
  • 打赏
  • 举报
回复
引用 1 楼 u012002376 的回复:
把所有代码都帖出来吧,
其他的有些代码是关于Java web的,我感觉不影响我以上要表达的意思.简单点比较好
满无解 2014-06-28
  • 打赏
  • 举报
回复
把所有代码都帖出来吧,
代码下载链接: https://pan.quark.cn/s/a8fbca3925b4 《鸿蒙OS开发环境构建》指南系统性地阐述了配置和筹备鸿蒙OS开发所需的各种工具和条件的具体方法。鸿蒙OS,亦称HarmonyOS,是由华为研发的一款面向全场景的分布式操作系统,其目标是提供跨平台、多设备间无缝协作的使用体验。本指南涉及了从Linux服务器到Windows工作站的完整开发流程。指南中提及了MobaXterm,这是一款用于连接Linux源码服务器的软件,使得开发人员能够在Windows环境中远程访问Linux服务器。同时,HiTool作为烧录工具,用于将编译后的系统镜像写入开发板。IPOP.EXE则是一款串口终端软件,用于执行串行通信和调试任务。Embedded Studio用于开发设备驱动程序,而DevEco Studio是华为提供的图形化应用程序开发平台,支持C/C++语言,拥有代码编辑、编译、烧录和调试功能,被视为OpenHarmony智能设备开发者的首选集成开发环境。在硬件配置方面,指南列出了必需的设备,包括Linux服务器(推荐Ubuntu 16.04及以上版本),Windows工作台(兼容XP/7/10),以及Hi3518EV300 IoT Camera单板。开发期间,Windows工作台通过USB线与单板相连接,以实现数据传输。此外,为了开展开发工作,还需要安装putty、IPOP、tftp服务器等辅助软件,以及HiTool用于烧录操作。在软件系统要求方面,Linux服务器需要安装bash、Python3.7+、gn、ninja、LLVM等构建工具,这些工具对于生成和执行编译脚本具有关键作用。在Windows工作台上,建议采用Visual Studi...

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧