3

私は現在、一連の文字列を見て、それらを使用してウィンドウを作成するように設計されたライブラリを作成しています。現在、ほんの数行のコードと巨大な構成ファイルだけで、多くのウィンドウやその他のものでそれが引き起こされます。メソッドのパラメーターのために、いくつかの文字列を読み取り、それらからクラスをロードするように設定しました。これを行うメソッドは次のとおりです。

    private Class<?> getClass(String classname){
        switch(classname){//Check for some primitive type references, since they don't work in the below area
            case "int":
                return int.class;
            case "double":
                return double.class;
            case "boolean":
                return boolean.class;
            case "long":
                return long.class;
            case "short":
                return short.class;
        }
        Class<?> value = null;
        try{
            value = Config.class.getClassLoader().loadClass(classname);
        }catch(ClassNotFoundException ex){
            Error.error(ErrorLevel.severe, "Could not find class- "+classname, ex, ErrorCatagory.classFinding);//A custom error handling system
        }
        return value;//Return the class found from the name
    }

通常のクラスでは問題なく動作します。たとえば、java.lang.String を入れると、String クラスが返ってきます。javax.swing.JTextField を配置すると、適切なクラスが返されます。ただし、java.lang.String[] を入れて文字列の配列を要求すると、次のようにクラッシュします。

    Warning in catagory code- message = Could not find suitable instance for method- Expected JTextComponent but found JTextField!
    Severe error in catagory classFinding
    May 16, 2012 11:02:35 AM ErrorAdapter severeError
    SEVERE: Could not find class- java.lang.String[]
    java.lang.ClassNotFoundException: java.lang.String[]
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
        at Config.getClass(Config.java:389)
        at Config.getClasses(Config.java:398)
        at Config.methodCall(Config.java:492)
        at Config.call(Config.java:415)
        at Config.chainCall(Config.java:439)
        at Config.call(Config.java:409)
        at main.action(main.java:122)
        at main$1$5.actionPerformed(main.java:63)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
        at java.awt.Component.processMouseEvent(Component.java:6505)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
        at java.awt.Component.processEvent(Component.java:6270)
        at java.awt.Container.processEvent(Container.java:2229)
        at java.awt.Component.dispatchEventImpl(Component.java:4861)
        at java.awt.Container.dispatchEventImpl(Container.java:2287)
        at java.awt.Component.dispatchEvent(Component.java:4687)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
        at java.awt.Container.dispatchEventImpl(Container.java:2273)
        at java.awt.Window.dispatchEventImpl(Window.java:2713)
        at java.awt.Component.dispatchEvent(Component.java:4687)
        at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)
        at java.awt.EventQueue.access$000(EventQueue.java:101)
        at java.awt.EventQueue$3.run(EventQueue.java:666)
        at java.awt.EventQueue$3.run(EventQueue.java:664)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
        at java.awt.EventQueue$4.run(EventQueue.java:680)
        at java.awt.EventQueue$4.run(EventQueue.java:678)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

最初の行 (「警告」で始まる行) は、 JTextField.class で Class.getDeclaredMethod() を使用して getText() メソッドを取得しようとするとクラッシュすることが原因で発生しました。残りはクラッシュレポートです。

これを修正して、任意のクラス/配列の深さで動作させる方法はありますか (したがって、java.lang.String[]、javax.swing.JTextField[][][]、および int[ で動作します)。 ][] それらのいずれもハードコーディングせずに)?

また、補足として、文字列に基づいてプリミティブ型のクラスを取得するより良い方法があるでしょうか?

4

4 に答える 4

2

[Ljava.lang.String;クラスのランタイム署名ですjava.lang.String[]

System.out.println(String[].class.getName());
于 2012-05-16T15:23:04.090 に答える
0

ライブラリを作成している場合は、クライアントに親切にして、配列の代わりに Collections クラスを使用してください。

java.lang.Integerプリミティブ型の場合、ボックス化されたバージョン (など)をいつでも渡すことができます。

于 2012-05-16T15:27:15.290 に答える