2015-09-03 3 views
0
Class c = Integer.class 

Скажите, что у меня есть только c Как я могу создать объект Integer?Как создать объект из значения java.lang.Class?

Обратите внимание, что это не обязательно должно быть Integer, я хотел бы сделать это для чего угодно.

+0

В ответ на похороненный комментарий: типы времени компиляции - это компиляция. * Невозможно объявить переменную «c» * для произвольного объекта класса. Вам придется обрабатывать полученный объект (как бы это ни было), как наиболее общий тип покрытия (например, «Object») и/или специализировать-приведение по мере необходимости (например, '(Integer) i') и/или использовать отражение , – user2864740

+0

в ваших комментариях вы всегда просите имя класса - возможно, вы ищете 'java.lang.Class.getName()' ?? –

+0

Начните с ['Class # isAssignableFrom'] (https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#isAssignableFrom-java.lang.Class-), чтобы определить, данный «класс» может быть присвоен другому типу класса, например 'c.isAssignableFrom (Integer.class)', это, по крайней мере, скажет вам, является ли данный класс или совместимым. – MadProgrammer

ответ

-2

Попробуйте

Class c = Class.forName("package.SomeClass");//If you have any specific class 

И затем экземпляр:

Object obj = c.newInstance(); 

int intObj = (Integer) obj 
+4

'java.lang.InstantiationException ... Причиненный: java.lang.NoSuchMethodException: java.lang.Integer. () ' – MadProgrammer

+1

Отложите то, что вы отредактировали, этот ответ на самом деле помог мне, спасибо – Aequitas

+1

Для upvoter: класс Integer не имеет конструктора по умолчанию, поэтому текущий код вызовет исключение (отмечено @MadProgrammer). –

1

Вы можете использовать метод newInstance().

c.newInstance(); 

Создает исключение.

Выход:

Caused by: java.lang.NoSuchMethodException: java.lang.Integer.<init>() 

Update:

Для класса, которые не имеют значения по умолчанию (не параметризированный) конструктор, вы не можете создать экземпляр, не зная его тип. Для других см. Приведенный ниже пример и его вывод.

public static void main(String[] args) throws InstantiationException, IllegalAccessException { 
    Class stringClass = String.class; 
    Class integerClass = Integer.class; 

    try { 
     System.out.println(stringClass.getConstructor()); 
     Object obj = stringClass.newInstance(); 
     if (obj instanceof String) { 
      System.out.println("String object created."); 
     } 

     System.out.println(integerClass.getConstructor()); 
     obj = integerClass.newInstance(); 
     if (obj instanceof Integer) { 
      System.out.println("String object created."); 
     } 

    } catch (NoSuchMethodException e) { 
     // You can not create instance as it does not have default constructor. 
     e.printStackTrace(); 
    } catch (SecurityException e) { 
     e.printStackTrace(); 
    } 
} 

Выход:

public java.lang.String() 
String object created. 
java.lang.NoSuchMethodException: java.lang.Integer.<init>() 
    at java.lang.Class.getConstructor0(Unknown Source) 
    at java.lang.Class.getConstructor(Unknown Source) 
    at xyz.Abc.main(Abc.java:15) 
+0

Как бы присвоить это объекту Integer? например 'c.class integerObject = c.newInstance();' – Aequitas

+5

Он будет терпеть неудачу с 'InstantiationException'. Класс Integer не имеет нулевого конструктора. –

+3

'Причиненный: java.lang.NoSuchMethodException: java.lang.Integer. () ' – MadProgrammer

0

С экземплярами Integer кл задница являются immutable, вам нужно что-то вроде этого:

public static void main(String args[]) throws Exception { 
    Class<?> c = Integer.class; 
    Constructor<?>[] co = c.getDeclaredConstructors(); // get Integer constructors 
    System.out.println(Arrays.toString(co)); 
    Integer i = (Integer) co[1].newInstance("5"); //call one of those constructors. 
    System.out.println(i); 
} 

O/P:

[public java.lang.Integer(int), public java.lang.Integer(java.lang.String) throws java.lang.NumberFormatException] 
5 

Вы должны явно делать эти вещи, потому что Integer класс не обеспечивает мутаторов/конструктор по умолчанию все мы Инициализация значений с использованием впрыска конструктора.

+0

Любопытно, что это связано с тем, что класс является «неизменным»? – Codebender

+1

'co [1]'? Надеюсь, что все версии Java имеют одни и те же конструкторы в одной последовательности. – Andreas

+0

Целочисленные * объекты * неизменяемы; но это не относится к вопросу. – user2864740

Смежные вопросы