gpt4 book ai didi

Java 将传递给方法的对象转换为其原始类型

转载 作者:行者123 更新时间:2023-12-01 09:02:48 28 4
gpt4 key购买 nike

我有一个名为 itemsData 的 EtcStruct 类对象列表,但该类可能会有所不同,具体取决于我要使用的文件(该类充满了变量 setter 和 getter ):

ObservableList<EtcStruct> itemsData =  FXCollections.observableArrayList();

我将其传递给应该适用于我选择的任何对象类型的方法,并从文件中运行调用的方法。

public static void parseToFile(ObservableList itemsData){
EtcStruct itemObject = (EtcStruct) itemsData.get(0);
System.out.print((int)reflectedmethod.invoke(itemObject);
}

上面的代码可以工作,但我想要实现的是使该方法在不编辑其对象类型的情况下工作,以使其对于我计划使用的任何结构类都更加灵活。

我尝试了一些传递 Struct 类名称和 .getClass() 的方法,它返回原始类型,但我不知道如何处理它来创建 itemsData 原始类型的新对象并强制转换 itemsData 对象。

public static void parseToFile(ObservableList itemsData,Class c){
Object itemObject = c.newInstance();
Object newobject = curClass.newInstance();
newobject = c.cast(itemsList.get(0));
}

以上对我来说似乎很愚蠢,而且显然不起作用。

最佳答案

阅读您的评论后,我更好地理解了为什么人们会在您的案例中使用反射。 GUI 构建器/编辑器是一个示例,其中使用反射来提供设置/获取组件值的接口(interface)。不过,恕我直言,当您拥有类并且是主要设计者时,反射并不是您设计的工具。如果可能的话,你应该争取更像这样的东西:

interface Parsable {
default int parse() {
System.out.println("Here I do something basic");
return 0;
}
}

class BasicStruct implements Parsable { }

class EtcStruct implements Parsable {

@Override
public int parse() {
System.out.println("Here I do something specific to an EtcStruct");
return 1;
}
}

// If some structs have a parent-child relationship
// you can alternatively `extend EtcStruct` for example.
class OtherStruct extends EtcStruct {

@Override
public int parse() {
super.parse();
System.out.println("Here I do something specific to an OtherStruct");
return 2;
}
}

void parseToFile(Parsable parsable) {
System.out.println(parsable.parse());
}

// If you use a generic with a specific class you don't
// have to guess or care which kind it is!
void parseToFile(ObservableList<Parsable> parsables) {
for (Parsable p : parsables) {
parseToFile(p);
}
}


public static void main(String[] args) {
ObservableList<Parsable> parsables = FXCollections.observableArrayList();
parsables.add(new BasicStruct());
parsables.add(new EtcStruct());
parsables.add(new OtherStruct());
parseToFile(parsables);
}


输出:

Here I do something basic
0
Here I do something specific to an EtcStruct
1
Here I do something specific to an EtcStruct
Here I do something specific to an OtherStruct
2

当然,这只是一个示例,需要进行更改以满足您的需求。

但我仍然不明白的是,如果您能够从文件中解析,为什么您无法解析为文件。尽管如此,我还是打了some code一起向您展示在仅处理 Object 时如何手动将对象解析为文件。

这个想法是为了满足类似 Bean 的契约。也就是说,每个结构都应该提供一个无参数构造函数,您希望通过反射管理的所有字段都将遵循 Java 命名约定,并且将具有公共(public) setter 和 getter。

不要陷入文件写入中;这将由您的需求决定。请注意,通过遵循此约定,我可以将任何 Object 视为可解析结构。这里有一个不太完善的版本供引用:

public void parseToFile(Object object) throws IOException, InvocationTargetException, IllegalAccessException {
fos = new FileOutputStream("example" + object.getClass().getSimpleName());
List<Method> getters = Arrays.stream(object.getClass().getMethods())
.filter(method -> method.getName().startsWith("get") && !method.getName().endsWith("Class"))
.collect(Collectors.toList());
for (Method getter : getters) {
String methodName = getter.getName();
String key = String.valueOf(Character.toLowerCase(methodName.charAt(3))) +
methodName.substring(4, methodName.length());
fos.write((key + " : " + String.valueOf(getter.invoke(object)) + "\n").getBytes());
}
fos.close();
}

关于Java 将传递给方法的对象转换为其原始类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41540366/

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