Получение типа класса из String


87

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

Class cls = (string).class

Как я могу это сделать?


что, если класс находится в другом проекте?
Стивен

1
На ваш комментарий: Что! ??? Если бы ваш класс был в другом проекте, разве это не зависело бы от вашей IDE? Что касается вашего приложения, в любом случае это будет выглядеть так, как если бы оно было в одном проекте, потому что на его библиотеки ссылаются извне. Мол, вы знаете, что классов Java API нет в вашем проекте, верно? Но компилятор вашей IDE знает, где их найти, если ваша IDE настроена правильно. То же самое относится к вашим классам из другого проекта.
user919860

Ответы:


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

Но вы classNameдолжны быть полностью квалифицированными - т.е.com.mycompany.MyClass


2
его бросает исключение ClassNotFound
Стивен

1
тогда либо класс не указан в пути к классам, либо вы не передаете полностью определенное имя класса, например com.mycompany.project.ClassName
Hans Westerbeek

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

да, класс в одном пакете
Стивен

1
У меня такая же проблема с 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 */ }
kumaheiyama

43
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 для получения дополнительных сведений.


3
В ответе Божо может быть больше пунктов, но я думаю, что ваш ответ более информативен. PS. Почему тебя зовут ХуанЗе ??? Это почти похоже на смесь испанского и китайского языков. : 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); Если жестко задано полное имя класса в качестве параметра, все работает нормально. Любое предложение?
Дибьяншу Джайсвал

@djthequest Если наша clsNameпеременная содержит полное имя класса, не должно быть разницы между ее использованием и жестко запрограммированной строкой. У вас может не быть нужного вам класса в пути к классам. Это может помочь создать экземпляр общего класса из той же банки в вашем коде запуска, чтобы убедиться, что библиотека присутствует в загрузчике классов.
rsp

спасибо за ваш ответ, но вместо переменной, если я жестко закодирую строку, работает fins, это означает, что классы находятся в пути к классам, верно? Позже я понял, что Class.forName()метод ожидает finalпеременную. Простая переменная не работает.
Дибьяншу Джайсвал

4

Вы можете получить ссылку на любой класс во время выполнения с помощью концепции отражения 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 вызывается для получения объекта класса

Используя объект класса, мы создаем новый экземпляр класса.

Любые сомнения по этому поводу дайте мне знать


что, если класс находится в другом проекте?
Стивен

1
Можете ли вы получить jar-файл этого проекта и указать имя класса, например Class.forName ("oracle.jdbc.driver.OracleDriver")
gmhk


2

Не уверен, о чем вы спрашиваете, но ... Может быть, Class.forname ?


его бросает исключение ClassNotFound
Стивен

что, если класс находится в другом проекте?
Стивен

1
Я вижу, что на твой вопрос никто не отвечает. Не имеет значения, находится ли он в другом проекте, если компилятор знает, где искать. Поскольку вы, вероятно, используете IDE, это, вероятно, зависит исключительно от IDE. Что касается ссылок, вы знаете, что всех классов, на которые вы ссылаетесь из библиотек Java, нет в вашем проекте, верно? Но компилятор знает, где их искать, потому что знает, что на них есть внешние ссылки. Кажется, что вам нужно изучить основы программирования на Java, когда вы пытаетесь заняться продвинутым программированием на Java. : |
user919860
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.