Java反射的恰当性

时间:2010-05-15 18:45:51

标签: java reflection

这可能是一个相当主观的问题,但也许不是。 我的应用程序包含一堆在不同时间向用户显示的表单。每个表单都是自己的一个类。通常,用户单击一个按钮,该按钮将启动一个新表单。

我有一个方便的功能来构建这些按钮,你可以这样称呼它:

buildButton( "button text", new SelectionAdapter() {
     @Override
     public void widgetSelected( SelectionEvent e ) {
        showForm( new TasksForm( args... ) );
     }
  } );

我这样做了几十次,每次制作一个SelectionAdapter真的很麻烦。

我真正需要的按钮才能知道在点击时要实例化的类以及为构造函数提供的参数,所以我构建了一个我这样调用的函数:

buildButton( "button text", TasksForm.class, args... );

其中args是可用于正常实例化TasksForm的任意对象列表。

它使用反射从类中获取构造函数,匹配参数列表,并在需要时构建实例。大多数时候,我根本不需要将任何参数传递给构造函数。缺点显然是,如果我传递了一组错误的参数,它在编译时无法检测到,所以如果它失败,则会在运行时显示一个对话框。但它通常不会失败,如果确实如此,它将很容易调试。

我认为这更清晰,因为我来自使用函数和类文字很常见的语言。但是如果你是一个普通的Java程序员,你会看到这个怪胎,或者你是否会欣赏不必扫描多个SelectionAdapters?

5 个答案:

答案 0 :(得分:3)

是的,通常反思是不赞成的,但在某些情况下它可能非常有用。我会很感激阅读代码,我可以相当快速地消化,而不必经历无数的小事。

答案 1 :(得分:1)

如果我理解正确,您希望使用不同类型的按钮实现(表单)执行一个操作(createButton)以进行参数。这听起来就像你需要多态性一样。

我建议你忘记反思并在一个共同的界面下构建这些形式。 让我们说吧 interface Form { //some methods here }

所有表单都必须实现公共接口,并且这些方法是创建按钮所必需的。因此,如果您有Form对象,则可以将其传递给createButton(Form formObject){...}

如果所有SelectionAdapter都调用showForm方法,则可以将其添加到公共interface Form,并为Form对象调用此方法。因此,您不需要创建许多匿名类,只需要创建一个匿名类,并使用“Form”对象进行实例化。

所以你需要的只是多态性和为这些类选择的接口。

如果您在创建Form对象时遇到很大问题(它们的构造函数不同),您可能应该考虑创建一个仅处理构造的MyFormBuilder。构建器将使用createInstance()方法或getInstance()方法完成所有工作。

根据我的建议,您将拥有1个SelectionAdapter类实现,您将使用通用接口传递对象并避免反射,传递MyClass.class参数等等。

答案 2 :(得分:0)

问题本身并不是反思。现代框架一直使用反射。使用注释来做各种事情是很简单的,这通常需要反思。

但是,在你的情况下,为什么不这样做:

buildButton( "button text",
        new SelectionAdapterImplementation(new TaskForm(args)) )

除非您的匿名类使用范围中的最终变量,否则我没有理由。

答案 3 :(得分:0)

您已修改buildButton(String, SelectionAdapter)以参加您将要反映的课程。我收集到您现在正在修改后的方法中创建一个新的SelectionAdapter,然后反映类名,创建一个实例并将其传递给showForm(arg)。我认为这比你需要走得更远。

相反,您可以使用showForm(arg)所需的任何类的实例。关键是在final的arglist中进行争论buildButton,您将能够在匿名课程中使用它。

答案 4 :(得分:0)

另一种方法是在每个表单中都有一个静态方法,它返回一个创建表单的按钮。但反思可能会更好。