簡體   English   中英

如何創建一個只有文本名稱的類數組?

[英]How do I create an array of a class that I only have the textual name for?

我目前正在創建一個庫,旨在查看一堆字符串並使用它們創建窗口。 目前,只有幾行代碼和一個巨大的配置文件將使用大量的窗口和東西來設置它。 我把它設置為讀取一些字符串並從中加載類,以獲取方法的參數。 這是執行此操作的方法:

    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 [ ] []沒有硬編碼任何一個)?

另外,在旁注中,是否有更好的方法來獲取基於字符串的基元類型的類?

你有沒有嘗試過:

的Class.forName( “[Ljava.lang.String;”); 一串字符串?

http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#forName(java.lang.Stringhttp://java.dzone.com/news/obtaining-array-類的Java-REF

[Ljava.lang.String; 是類java.lang.String[]的運行時簽名

System.out.println(String[].class.getName());

數組名稱在Java中表示不同。 您可以按如下方式修改方法來處理數組:

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 "int[]":
            return int[].class;
        case "double":
            return double.class;
        case "double[]":
            return double[].class;
        case "boolean":
            return boolean.class;
        case "boolean[]":
            return boolean[].class;
        case "long":
            return long.class;
        case "long[]":
            return long[].class;
        case "short":
            return short.class;
        case "short[]":
            return short[].class;
        case "char":
            return char.class;
        case "char[]":
            return char[].class;
    }
    Class<?> value = null;
    int arrayLevel = 0;
    while (classname.endsWith("[]")) {
        classname = classname.substring(0, classname.length()-2);
        arrayLevel++;
    }
    while (arrayLevel-- != 0) {
        className = "[L" + className + ";";
    }
    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
}

如果您正在創建庫,請對您的客戶端好,並使用Collections類而不是數組。

對於基本類型,您始終可以傳遞盒裝版本( java.lang.Integer等)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM