У мене є String
який має назву класу say "Ex"
(без .class
розширення). Я хочу призначити його Class
змінній, наприклад:
Class cls = (string).class
Як я можу це зробити?
У мене є String
який має назву класу say "Ex"
(без .class
розширення). Я хочу призначити його Class
змінній, наприклад:
Class cls = (string).class
Як я можу це зробити?
Відповіді:
Class<?> cls = Class.forName(className);
Але ви className
повинні мати повну кваліфікацію - тобтоcom.mycompany.MyClass
className
ви передаєте? Чи є на вашому шляху такий клас?
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 */ }
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 для отримання додаткової інформації.
String clsName = "com.mydoamin.className"; Class cls = Class.forName(clsName);
Якщо є жорстким кодом повне ім'я класу як параметр, то все працює нормально. Будь-яка пропозиція?
Ви можете використовувати forName
метод Class
:
Class cls = Class.forName(clsName);
Object obj = cls.newInstance();
String clsName = "com.mydoamin.className"; Class cls = Class.forName(clsName);
Якщо жорсткий код повне ім'я класу як параметр, то все працює нормально. Будь-яка пропозиція?
clsName
змінна містить повністю кваліфіковане ім'я класу, між її використанням та жорстко закодованим рядком не повинно бути різниці. Можливо, у вас немає потрібного класу в шляху до класу. Це може допомогти створити загальний клас із тієї ж банки у вашому коді запуску, щоб переконатися, що бібліотека присутня у завантажувачі класів.
Class.forName()
метод очікує final
змінної. Проста змінна не буде працювати.
Ви можете отримати посилання на клас будь-якого класу під час виконання за допомогою 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 викликається для отримання об’єкта класу
Використовуючи об’єкт класу, ми створюємо новий екземпляр класу.
Будь-які сумніви щодо цього повідомте мене
Вона повинна бути:
Class.forName(String classname)
Не впевнені, що ви запитуєте, але ... Можливо , Class.forname ?