gpt4 book ai didi

java - 具有继承的构造函数中的反射(Java)

转载 作者:行者123 更新时间:2023-11-29 04:33:30 25 4
gpt4 key购买 nike

我在使类构造函数中的反射与继承一起工作时遇到问题。具体来说,我想获取所有属性值。

这是一个无法正常工作的简单实现的演示:

import java.lang.reflect.Field;

public class SubInitProblem {
public static void main(String[] args) throws IllegalAccessException {
Child p = new Child();
}
}

class Parent {
public int parentVar = 888888;

public Parent() throws IllegalAccessException {
this.showFields();
}

public void showFields() throws IllegalAccessException {
for (Field f : this.getClass().getFields()) {
System.out.println(f + ": " + f.get(this));
}
}
}

class Child extends Parent {
public int childVar = 999999;

public Child() throws IllegalAccessException {
super();
}
}

这将显示 childVar 为零:

public int Child.childVar: 0
public int Parent.parentVar: 888888

因为还没有初始化。

所以我想我不需要直接使用构造函数,而是让构造函数完成,然后使用showFields:

import java.lang.reflect.Field;

public class SubInitSolution {
public static void main(String[] args) throws IllegalAccessException {
SolChild p = SolChild.make();
}
}

class SolParent {
public int parentVar = 888888;

protected SolParent() {
}

public static <T extends SolParent> T make() throws IllegalAccessException {
SolParent inst = new SolParent();
inst.showFields();
return (T) inst;
}

public void showFields() throws IllegalAccessException {
for (Field f : this.getClass().getFields()) {
System.out.println(f + ": " + f.get(this));
}
}

}

class SolChild extends SolParent {
public int childVar = 999999;

public SolChild() throws IllegalAccessException {
}
}

但这不起作用,因为 make 没有为子类返回正确的类型。 (所以问题是 new SolParent();)。

解决这个问题的最佳方法是什么? 我需要所有子类都执行 showFields,但我不能依赖它们明确地执行此操作。

最佳答案

您的 showFields 方法需要遍历类层次结构,如下所示:

public void showFields() throws IllegalAccessException {
Class<?> clz = this.getClass();
while(clz != Object.class) {
for (Field f : clz.getDeclaredFields()) {
f.setAccessible(true);
System.out.println(f + ": " + f.get(this));
}
clz=clz.getSuperclass();
}
}

请注意,我使用了 Class.getDeclaredFields() , 不是 Class.getFields() ,因为后者只处理公共(public)字段。


这就是您如何以通用方式构建您的类:

public static <T extends SolParent> T make(Class<T> type) throws Exception {
Constructor<T> constructor = type.getDeclaredConstructor();
constructor.setAccessible(true);
T inst = constructor.newInstance();
inst.showFields();
return inst;
}

请注意,这仅在您的 SolParent 子类型具有公共(public)无参数构造函数(或根本没有构造函数)时才有效。

关于java - 具有继承的构造函数中的反射(Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42788693/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com