我在滥用/滥用Java反射吗?

Joh*_* B. 6 java reflection casting

我正在编写一个程序来读取文件中的数据,该文件可能是多种格式之一(实际上是相同格式的不同版本),我正在使用反射来为每种格式调用相应的函数.假设文件格式是在文件的第一个字节上指定的数字:

Class DataFile extends Model {
...
Blob file
...
public void parse() throws Exception{

    InputStream is = file.get();

    Class c = Class.forName("models.DataFile");
    Method m = c.getMethod("parse_v"+is.read(), (Class []) null);
    m.invoke(this, (Object []) null);
}

public void parse_v0() throws Exception{
   ...
}

public void parse_v1() throws Exception{
   ...
}
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,我是在滥用/滥用反思吗?我觉得我应该使用继承并使用自己的"解析"过程为每个文件类型创建一个不同的类,但在开始解析之前我不知道文件类型...然后我不能"低估"只是使用这样的东西((DataFile_v1) this).parse()我有点迷失.

感谢您的时间!

Ern*_*ill 7

这没有什么根本性的错误,但是更灵活和可扩展的方法来做同样的事情就是将版本信息用作a中的键Map,并将值放在Mapbe handler对象中.然后任何代码都可以注册一个处理程序(处理程序都可以实现一个公共接口),你的读者代码可以只查找处理程序Map并调用它.

一定要处理Map不包含特定版本处理程序的情况!