Отримання типу класу з рядка


84

У мене є Stringякий має назву класу say "Ex"(без .classрозширення). Я хочу призначити його Classзмінній, наприклад:

Class cls = (string).class

Як я можу це зробити?


що робити, якщо клас в іншому проекті?
Стівен

1
До Вашого коментаря: Що! ??? Якби ваш клас був в іншому проекті, то чи не залежав би це від вашої IDE? Що стосується вашої програми, то це могло б бути, ніби вона все одно була в одному проекті, оскільки на її бібліотеки посилаються зовні. Мовляв, ви знаєте, що класи Java API не є у вашому проекті, так? Але компілятор для вашої IDE знає, де їх знайти, якщо ваша IDE налаштована правильно. Те саме стосується ваших занять з іншого проекту.
user919860

Відповіді:


165
Class<?> cls = Class.forName(className);

Але ви classNameповинні мати повну кваліфікацію - тобтоcom.mycompany.MyClass


2
його викид ClassNotFound Exception
Стівен

1
тоді або клас не на шляху до класу, або ви не передаєте повністю кваліфіковану назву класу, наприклад com.mycompany.project.ClassName
Ганс Вестербек

яке значення classNameви передаєте? Чи є на вашому шляху такий клас?
Божо

так, Клас в тому ж пакеті
Стівен

1
У мене така сама проблема з ClassNotFoundException. Фокус полягав у тому, щоб впоратися з винятком у спробі вловити. Приблизно так:try { Class<?> cls = Class.forName("com.company.MyClass"); } catch (ClassNotFoundException ex) { /* do something to handle the case when the string isn't valid and therefor the class can't be found */ }
kumaheiyama

43
String clsName = "Ex";  // use fully qualified name
Class cls = Class.forName(clsName);
Object clsInstance = (Object) cls.newInstance();

Перегляньте підручник із Java щодо Роздуму за адресою http://java.sun.com/docs/books/tutorial/reflect/TOC.html для отримання додаткової інформації.


3
У відповіді Божо може бути більше пунктів, але я думаю, що ваша відповідь є більш описовою. PS. Чому вас звуть JuanZe ??? Майже звучить як поєднання іспанської та китайської мов. : D. Чи є в цьому якесь розумне значення?
user919860

Я працюю з динамічним веб-проектом в eclipse. Я використовую наведений вище код для отримання класу. але він повертає ClassNotFoundException, коли я використовую рядкову змінну, подібну до цієї: String clsName = "com.mydoamin.className"; Class cls = Class.forName(clsName); Якщо є жорстким кодом повне ім'я класу як параметр, то все працює нормально. Будь-яка пропозиція?
Dibyanshu Jaiswal,

8

Ви можете використовувати forNameметод Class:

Class cls = Class.forName(clsName);
Object obj = cls.newInstance();

Я працюю з динамічним веб-проектом в eclipse. Я використовую наведений вище код для отримання класу. але він повертає ClassNotFoundException, коли я використовую рядок змінної, як це: String clsName = "com.mydoamin.className"; Class cls = Class.forName(clsName); Якщо жорсткий код повне ім'я класу як параметр, то все працює нормально. Будь-яка пропозиція?
Dibyanshu Jaiswal,

@djthequest Якщо наша clsNameзмінна містить повністю кваліфіковане ім'я класу, між її використанням та жорстко закодованим рядком не повинно бути різниці. Можливо, у вас немає потрібного класу в шляху до класу. Це може допомогти створити загальний клас із тієї ж банки у вашому коді запуску, щоб переконатися, що бібліотека присутня у завантажувачі класів.
rsp

дякую за вашу відповідь, але замість змінної, якщо я жорстко кодую рядок, працює плавники, це означає, що класи знаходяться в шляху до класу, так? Пізніше я зрозумів, Class.forName()метод очікує finalзмінної. Проста змінна не буде працювати.
Dibyanshu Jaiswal

4

Ви можете отримати посилання на клас будь-якого класу під час виконання за допомогою Java Reflection Concept.

Перевірте нижченаведений код. Пояснення подано нижче

Ось один приклад, який використовує повернутий клас для створення екземпляра AClass:

package com.xyzws;
class AClass {
    public AClass() {
        System.out.println("AClass's Constructor"); 
    }  
    static {   
        System.out.println("static block in AClass");  
    }
}
public class Program {   
    public static void main(String[] args) {
        try {       
            System.out.println("The first time calls forName:");   
            Class c = Class.forName("com.xyzws.AClass");      
            AClass a = (AClass)c.newInstance();    
            System.out.println("The second time calls forName:");  
            Class c1 = Class.forName("com.xyzws.AClass"); 
        } catch (ClassNotFoundException e) { 
            // ...
        } catch (InstantiationException e) {  
            // ...
        } catch (IllegalAccessException e) { 
            // ...
        }     
    }
}

Друкована продукція

    The first time calls forName:
    static block in AClass
    AClass's Constructor
    The second time calls forName:

Клас уже завантажений, тому немає другого "статичного блоку в AClass"

Пояснення нижче

Class.ForName викликається для отримання об’єкта класу

Використовуючи об’єкт класу, ми створюємо новий екземпляр класу.

Будь-які сумніви щодо цього повідомте мене


а якщо клас в іншому проекті?
Стівен

1
Чи можете ви отримати файл jar цього проекту та вказати назву класу, наприклад, Class.forName ("oracle.jdbc.driver.OracleDriver")
gmhk,


2

Не впевнені, що ви запитуєте, але ... Можливо , Class.forname ?


його викид ClassNotFound Exception
Стівен

а якщо клас в іншому проекті?
Стівен

1
Я бачу, що ніхто не відповідає на ваше запитання. Не має значення, чи це в іншому проекті, поки компілятор знає, де шукати. Оскільки ви, ймовірно, використовуєте IDE, це, ймовірно, залежить виключно від IDE. Що стосується посилань, ви знаєте, що всі класи, на які ви посилаєтесь із бібліотек Java, відсутні у вашому проекті, так? Але компілятор знає, де їх шукати, бо знає, що на них посилаються зовні. Здається, вам потрібно вивчити базове програмування на Java, коли ви намагаєтесь вдосконалити програмування на Java. : |
user919860
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.