Java 如何在运行时使用反射创建新的音乐播放器屏幕?

Java 如何在运行时使用反射创建新的音乐播放器屏幕?,java,design-patterns,reflection,Java,Design Patterns,Reflection,这是一周前我被问到的一个面试问题,问题是 你必须开发一个音乐播放器,让用户能够创建一个新的主题并使用它 我说有这样一个主题课 课堂主题{ par1; par2; par3; 盖特,塞特 } 当用户告诉我们的播放器创建一个新的主题时,我们将要求提供这些参数,通过使用setter,我们可以得到一个主题对象,其中的参数可以用于渲染 然而,他告诉我这是一个java反射问题,他说应该使用反射来获取类名等 有人知道这里如何使用反射吗?或者他们曾经被问过类似的问题吗?他们用反思来解决问题吗 我认为这可能与工厂

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

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

我说有这样一个主题课

课堂主题{ par1;
par2;
par3;

盖特,塞特

}

当用户告诉我们的播放器创建一个新的主题时,我们将要求提供这些参数,通过使用setter,我们可以得到一个主题对象,其中的参数可以用于渲染

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

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


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

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

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

假设这是我们的主题类:

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

    //Business Domain related attributes
    private User user;

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

这里的问题是我们的类具有与主题“look&feel”字段无关的属性。例如,主题用户字段(owner?)不应该带到用户。这个问题可以通过使用注释(>=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;

}

现在再次使用反射,我们只能显示与外观相关的属性(通过检查注释),另外,我们还可以获得有关字段的用户友好信息:例如,我们可以告诉用户存在一些“基本颜色”参数(比使用属性名“基本颜色”更好)他可以调整。

意思是类加载-动态加载主题,其中也包括类加载-通过调用
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中

用户在web上下载并将其复制到其应用程序的主题文件夹中

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

然后加载主题:

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

    theme.initialize();
final Class settingsClass=classLoader.loadClass(“MyTheme”);
Theme Theme=(Theme)设置class.newInstance();
theme.initialize();

但我的工作区中没有该类,是不是应该在运行时创建?你能给出你在帖子中所说内容的流程吗?编辑帖子以添加一个示例。好的,我的意思是,有一个web音乐播放器,用户使用应用程序的UI创建一个新主题。用户无法访问源代码,他所拥有的只是几个控件来提供新主题的参数。当他提交他的请求时,那么在某种程度上,新的类是有反射的还是没有反射的?至少我的理解是这样的。有道理吗?是的,有道理。这几乎是在中完成的。好吧,我认为它归结起来就是‘我们如何在bakcend中创建一个类’对吗?我查了一下,这似乎是其他技术,所以不能用反射来做吗?那么,我们如何通过反射来创造它呢?