[英]Java casting an object passed to method to its original type
我有一个名为EtcStruct类的对象的itemsData的列表,但是该类可以根据我要使用的文件而有所不同(该类充满了变量设置器和获取器):
ObservableList<EtcStruct> itemsData = FXCollections.observableArrayList();
我将其传递给应该适用于任何对象类型的方法,我选择并从文件中运行调用的方法。
public static void parseToFile(ObservableList itemsData){
EtcStruct itemObject = (EtcStruct) itemsData.get(0);
System.out.print((int)reflectedmethod.invoke(itemObject);
}
上面的代码有效,但是我想要实现的是使方法在不编辑对象类型的情况下工作,以使其对于我计划使用的任何structclass都更加灵活。
我尝试通过传递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 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
当然,这只是一个示例,需要对其进行更改以满足您的需求。
但是我仍然不明白的是,如果您能够从文件中解析出为什么无法解析为一个文件。 尽管如此,我还是拍了一些代码 ,向您展示了在仅处理Object
时如何手动将对象解析为文件。
这个想法是要满足像豆一样的合同。 也就是说,每个结构都应提供一个无参数的构造函数,您要通过反射管理的所有字段都将遵循Java命名约定,并且将具有公共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();
}
我认为您仍然可以使用泛型来保持静态对象的类型。 尝试参数化函数parseToFile。 这是一个例子:
public static void parseToFile(ObservableList<EtcStruct> itemsData){
EtcStruct itemObject = itemsData.get(0);
System.out.print((int)reflectedmethod.invoke(itemObject);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.