0

这是我一周前被问到的一个面试问题,问题是

您必须开发一个音乐播放器,让用户能够创建新主题并使用它。

我说比方说有这样的主题课

课堂主题{ par1;
标准杆2;
第 3 杆;

获取器,设置器

}

当用户告诉我们的播放器创建一个新主题时,我们会询问这些参数,并且通过使用 setter,我们可以拥有一个主题对象,其中包含可用于渲染的参数。

但是他告诉我这是一个java反射问题,他说你应该使用反射来获取类名等。

有人知道如何在这里使用反射吗?或者他们有没有被问过类似的问题?他们是否使用反射来解决问题?

我认为这可能与工厂设计模式有关,但我找不到给出的问题与设计模式之间的相似之处?

4

2 回答 2

1

可能意味着类加载-动态加载还包括类加载的主题-您通过调用获得所需的类Class.forName("org.package.YourTheme"),然后使用反射创建新实例。这个实例或插件可以自定义您的应用程序。

编辑:

这就是插件通常在 Java 应用程序中完成的方式。开发人员创建一个包含其实现的 JAR。在简单的情况下,他在应用程序中扩展了一个界面:

    interface Theme{
        void initialize();
        void handleEvent(AppEvent e);
    }

    class MyTheme implements Theme{
        public void initialize(){
            // init logic
        }

        public void handleEvent(AppEvent e){
            // handles the event
        }
    }

这两个类被开发者打包到 my-theme-0.1.jar 中。

用户在网络上下载它们并将它们复制到他的应用程序的主题文件夹中。

当应用程序启动时(或者这也可以在运行时完成),它会扫描主题文件夹并使用URLClassLoader加载所有插件。

然后你加载你的主题:

    final Class<?> settingsClass = classLoader.loadClass("MyTheme");
    Theme theme = (Theme) settingsClass.newInstance();

    theme.initialize();
于 2013-09-23T16:39:18.950 回答
0

我认为一种可能的解决方案如下:

我们将使用反射来获取所有属性,然后这些属性将用于将可定制的参数提供给用户。

假设这是我们的主题类:

Class Theme{ 
    //Customizable Theme related attributes
    private Color background;
    private Color baseColor;

    //Business Domain related attributes
    private User user;

}

我们可以使用反射来获取属性列表Theme::getDeclaredFields,然后我们可以获取它们的名称并告知用户这些属性并“询问”他想要自定义哪些值。

这里的问题是我们的类具有与主题“外观”字段无关的属性。例如,不应将主题用户字段(所有者?)带给用户。这个问题可以通过使用注解来解决(>= JDK 1.5)

我们的课程将如下所示:

Class Theme{ 
    //Customizable Theme related attributes
    @LookAndFeel(alias="Background", description="The background color of the player")
    private Color background;

    @LookAndFeel(alias="Base Color", description="The base color of the player")
    private Color baseColor;

    //Business Domain related attributes
    private User user;

}

现在再次使用反射,我们只能调出外观相关的属性(通过检查注释),并且我们有一个关于字段的用户友好信息作为奖励:例如。我们将能够告诉用户他可以调整一些“Base Color”参数(比使用我们的属性名称“baseColor”更好)。

于 2013-09-23T13:35:52.840 回答