Могу ли я создать экземпляр класса с помощью объекта класса? Как насчет конструкторов?

Я сохраняю список классов через (Classname.class) и хотел бы создать экземпляр? Возможно ли это?

newInstance похоже на метод, которым я занимаюсь, но он не поддерживает конструктор?

Ответ 1

Вы не можете создавать новые классы таким образом.

Если у вас есть имя класса, вы можете использовать Class.forName(className) для загрузки/ссылки на класс.

Если у вас есть байтовый код для класса, который вы хотите создать, вы можете загрузить загрузчик классов байтового кода и дать вам класс. Это, вероятно, будет более продвинутым, чем вы предполагали.

Ответ 2

Вы можете использовать Class.getConstructors (или Class.getConstructor), чтобы получить список доступных конструкторов и вызвать любой из них с помощью Constructor.newInstance, который принимает параметры.

Ответ 3

Просто добавьте одну точку, которую я вижу:

Вы можете вызвать newInstance непосредственно в объекте Class, если он имеет открытый конструктор null. (Null-конструктор - это конструктор без аргументов.)

В противном случае вы можете найти конструкторы через Class.getConstructors(), как говорили другие.

Ответ 4

Java учебник по размышлению охватывает это хорошо. Но да, в основном Class.getConstructors, а затем Constructor.newInstance, где он находится.

Ответ 5

Java разработан таким образом, что вы никогда не сможете "обмануть" его, пока используете java.lang/java. классов или других стандартных библиотек. Одна из самых важных особенностей ООП заключается в том, что объекты должны находиться в определенном состоянии, поэтому вы можете быть уверены, что конструктор всегда запускается. Даже если вы используете некоторые странно выглядящие библиотеки отражений, чтобы выполнить вашу работу.

Итак, используя Class.forName( "me.Test" ). newInstance(); (или аналогичный) будет под капотом вызывать для вас конструктор Test().

Если вы хотите вызвать другой конструктор, код выглядит примерно так:

Test test = (Test)Class.forName("Test").getConstructor(String.class).newInstance("Hello World");

Здесь getConstructor спрашивает, как выглядит конструктор (он хочет строку), а затем вы вызываете его со строкой.

Ответ 6

Если у вас есть список объектов Class, полученных через литералы классов, вы также можете статически ссылаться на конструкторы, а не на то, чтобы скользнуть в отражение зла.