Я сохраняю список классов через (Classname.class
) и хотел бы создать экземпляр? Возможно ли это?
newInstance
похоже на метод, которым я занимаюсь, но он не поддерживает конструктор?
Я сохраняю список классов через (Classname.class
) и хотел бы создать экземпляр? Возможно ли это?
newInstance
похоже на метод, которым я занимаюсь, но он не поддерживает конструктор?
Вы не можете создавать новые классы таким образом.
Если у вас есть имя класса, вы можете использовать Class.forName(className) для загрузки/ссылки на класс.
Если у вас есть байтовый код для класса, который вы хотите создать, вы можете загрузить загрузчик классов байтового кода и дать вам класс. Это, вероятно, будет более продвинутым, чем вы предполагали.
Вы можете использовать Class.getConstructors (или Class.getConstructor), чтобы получить список доступных конструкторов и вызвать любой из них с помощью Constructor.newInstance, который принимает параметры.
Просто добавьте одну точку, которую я вижу:
Вы можете вызвать newInstance
непосредственно в объекте Class
, если он имеет открытый конструктор null. (Null-конструктор - это конструктор без аргументов.)
В противном случае вы можете найти конструкторы через Class.getConstructors()
, как говорили другие.
Java учебник по размышлению охватывает это хорошо. Но да, в основном Class.getConstructors, а затем Constructor.newInstance, где он находится.
Java разработан таким образом, что вы никогда не сможете "обмануть" его, пока используете java.lang/java. классов или других стандартных библиотек. Одна из самых важных особенностей ООП заключается в том, что объекты должны находиться в определенном состоянии, поэтому вы можете быть уверены, что конструктор всегда запускается. Даже если вы используете некоторые странно выглядящие библиотеки отражений, чтобы выполнить вашу работу.
Итак, используя Class.forName( "me.Test" ). newInstance(); (или аналогичный) будет под капотом вызывать для вас конструктор Test().
Если вы хотите вызвать другой конструктор, код выглядит примерно так:
Test test = (Test)Class.forName("Test").getConstructor(String.class).newInstance("Hello World");
Здесь getConstructor спрашивает, как выглядит конструктор (он хочет строку), а затем вы вызываете его со строкой.
Если у вас есть список объектов Class
, полученных через литералы классов, вы также можете статически ссылаться на конструкторы, а не на то, чтобы скользнуть в отражение зла.