Создание объектов класса на основе сигнатуры типа - PullRequest
2 голосов
/ 17 марта 2010
Class.forName(boolean.class.getName());

Это не работает в Java - виртуальная машина дает вам исключение ClassNotFoundException. Мне нужно было что-то подобное, потому что я хотел отразить методы, основанные на строках, которые включали сигнатуры методов, например

public void doSomething(boolean yesWeCan, java.lang.String[] presidents);

В конце я придумал собственный ClassFactory, который переводит тип Strings в объекты класса. Эта фабрика включает в себя множество обработчиков для значений примитивов и массивов.

Обработчик для объектов типа массива выглядит примерно так:

if (isArrayOfObjects) {
   return Class.forName("L["+typeName.replace("[]", "")+";");
}

Мой вопрос - я что-то упустил в Java 1.5+ API, что может сработать?

Редактировать

Спасибо за ваши ответы, неудивительно, что Class.forName прекрасно работает с классами-обертками. Но я ищу решение для всех типов Java, включая массивы и примитивы. Таким образом, моя первая строка не опечатка. Некоторые сигнатуры методов имеют в качестве параметров java-примитивы, я не могу просто использовать класс-оболочку для отражения метода в библиотеке, мне действительно нужен объект Class для этого типа (например, логический).

Class<boolean> booleanClassObject = boolean.class;

отлично работает, как и

String name = boolean.class.getName();

Ответы [ 6 ]

1 голос
/ 17 марта 2010

Возможно, у вас есть число if с:

if (type.equals("boolean")) {
    return boolean.class;
} else if (type.equals("int")) {
    return int.class;
} .. etc
1 голос
/ 17 марта 2010

Может быть проще создать массив, а затем запросить его .class. Это то, что я делал в прошлом.

1 голос
/ 17 марта 2010

Будет работать следующее:

Class.forName(Boolean.class.getName());

Автоматический (не) бокс должен обрабатывать перевод на настоящий примитив. Хотя, не видя больше вашего кода, я не уверен, решит ли это вашу проблему.

0 голосов
/ 17 марта 2010
primitive type is a object and  not a class.  it can't getClassLoader and  getClassName.
the below expression will be wrong.
boolean a = new boolean();
0 голосов
/ 17 марта 2010

Вы используете логическое значение, которое является примитивом в Java. Вы должны использовать логический класс wrappaer в Java.

0 голосов
/ 17 марта 2010

Можете ли вы попробовать использовать класс-оболочку Boolean вместо примитива Boolean?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...