У меня String
есть имя класса, скажем "Ex"
(без .class
расширения). Я хочу присвоить это Class
переменной, например:
Class cls = (string).class
Как я могу это сделать?
У меня String
есть имя класса, скажем "Ex"
(без .class
расширения). Я хочу присвоить это Class
переменной, например:
Class cls = (string).class
Как я могу это сделать?
Ответы:
Class<?> cls = Class.forName(className);
Но вы className
должны быть полностью квалифицированными - т.е.com.mycompany.MyClass
className
вы проходите? Есть ли такой класс в вашем пути к классам?
ClassNotFoundException
. Уловка заключалась в том, чтобы обработать исключение в try-catch. Примерно так: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 по Reflection на 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.
Проверьте код ниже. Объяснение дано ниже
Вот один пример, который использует возвращенный класс для создания экземпляра 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 ?