用一个专业化的说法就是java reflect,其实这里可以猜想,我们的JDBC驱动也应该是这样在工作
先给名字再在需要时加载,这也是java的神奇之处,C#没研究过,不清楚有没有反射机制,貌似我看到好像也有。
好了,闲话不扯了,这些都是题外话

java reflect做了什么?其中奥秘就在UIDefaults中,这个类继承自HashMap

我关注的是JDK帮助中的一个警告

警告:
此类的序列化对象与以后的 Swing 版本不兼容。当前序列化支持适用于短期存储,或适用于在运行相同 Swing 版本的应用程序之间进行 RMI(Remote Method Invocation,远程方法调用)。从 1.4 版本开始,已在 java.beans 包中添加了支持所有 JavaBeansTM 长期存储的功能。请参见 XMLEncoder

这个警告说了什么。。。
也就是1.4之前已经有了这个类,我们不需要再重写这个类了,如果连这个类都要重写,那么代码量是惊人的
几乎重写了一套UI的事件+绘制,自己想想吧。


OK,简单说下LookAndFeel,这个东西很神奇,当你加载了一个外观时,这里面必须包含一个UIDefaults,这里包含了所有UI的细节,OK,我们做什么?把所有关于反射的参数设定好,利用put方法

例如:uiDefaults.put("PanelUI","com.ciash.swing.ui.DreamPanelUI");
这样你就有关于PanelUI的对应的类了,你的所有Panel都将去加载这个PanelUI。。。DreamPanelUI

但是,很关键的一点,你的PanelUI里必须有一个方法
public static ComponentUI createUI(JComponent c){
   //这里是你的静态UI
}
这个方法将利用java reflect调用,非常的恶心,没有接口,我也是看源代码才了解到的
后面的工作我还在继续,等有了新发现再写下吧

我准备把这东西拿到OpenSource上去