Создание экземпляра с использованием имени classа и вызывающего конструктора

Есть ли способ создать экземпляр определенного classа, учитывая имя classа (dynamic) и передать параметры его конструктору.

Что-то вроде:

Object object = createInstance("mypackage.MyClass","MyAttributeValue"); 

Где "MyAttributeValue" является аргументом для конструктора MyClass .

Да, что-то вроде:

 Class clazz = Class.forName(className); Constructor ctor = clazz.getConstructor(String.class); Object object = ctor.newInstance(new Object[] { ctorArgument }); 

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

Обратите внимание, что имя classа должно быть полностью квалифицированным, то есть включать пространство имен. Для вложенных classов вам нужно использовать доллар (как это использует компилятор). Например:

 package foo; public class Outer { public static class Nested {} } 

Чтобы получить объект Class для этого, вам понадобится Class.forName("foo.Outer$Nested") .

Вы можете использовать Class.forName() для получения объекта classа желаемого classа.

Затем используйте getConstructor() чтобы найти желаемый объект Constructor .

Наконец, вызовите newInstance() на этом объекте, чтобы получить новый экземпляр.

 Class c = Class.forName("mypackage.MyClass"); Constructor cons = c.getConstructor(String.class); Object object = cons.newInstance("MyAttributeValue"); 

Вы можете использовать отражения

 return Class.forName(className).getConstructor(String.class).newInstance(arg); 

Если class имеет только один пустой конструктор (например, Activity или Fragment и т. Д., Классы android):

 Class myClass = Class.forName("com.example.MyClass"); Constructor constructor = myClass.getConstructors()[0]; 

при использовании (т.е.) getConstructor(String.lang) конструктор должен быть объявлен открытым. В противном случае NoSuchMethodException .

если вы хотите получить доступ к непубличному конструктору, вы должны использовать вместо него (т.е.) getDeclaredConstructor(String.lang) .

Вы хотите использовать java.lang.reflect.Constructor.newInstance (Object …)

Очень простой способ создания объекта в Java с помощью Class С аргументом (-ами) конструктора:

Случай 1: – Вот небольшой код в этом Main classе:

 import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; public class Main { public static void main(String args[]) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { // Get class name as string. String myClassName = Base.class.getName(); // Create class of type Base. Class myClass = Class.forName(myClassName); // Create constructor call with argument types. Constructor ctr = myClass.getConstructor(String.class); // Finally create object of type Base and pass data to constructor. String arg1 = "My User Data"; Object object = ctr.newInstance(new Object[] { arg1 }); // Type-cast and access the data from class Base. Base base = (Base)object; System.out.println(base.data); } } 

И вот структура Base classа:

 public class Base { public String data = null; public Base() { data = "default"; System.out.println("Base()"); } public Base(String arg1) { data = arg1; System.out.println("Base("+arg1+")"); } } 

Случай 2: – Вы можете аналогичным образом кодировать конструктор с несколькими аргументами и конструктором копирования. Например, передача 3 аргументов в качестве параметра в конструктор Base потребует создания конструктора в classе и изменения кода выше:

 Constructor ctr = myClass.getConstructor(String.class, String.class, String.class); Object object = ctr.newInstance(new Object[] { "Arg1", "Arg2", "Arg3" }); 

И здесь базовый class должен как-то выглядеть:

 public class Base { public Base(String a, String b, String c){ // This constructor need to be created in this case. } } 

Примечание. Не забывайте обрабатывать различные исключения, которые необходимо обрабатывать в коде.

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

Вы можете создать объект мгновенно, вызывая первый конструктор, а затем вызывать первый метод в созданном объекте.

  Class c = Class.forName("mypackage.MyClass"); Constructor ctor = c.getConstructors()[0]; Object object=ctor.newInstance(new Object[]{"ContstractorArgs"}); c.getDeclaredMethods()[0].invoke(object,Object... MethodArgs); 

Если кто-то ищет способ создания экземпляра classа, несмотря на class, следующий за шаблоном Singleton, вот как это сделать.

 // Get Class instance Class clazz = Class.forName("myPackage.MyClass"); // Get the private constructor. Constructor cons = clazz.getDeclaredConstructor(); // Since it is private, make it accessible. cons.setAccessible(true); // Create new object. Object obj = cons.newInstance(); 

Это работает только для classов, реализующих singleton-шаблон с использованием частного конструктора.

Еще один полезный ответ. Как использовать getConstructor (params) .newInstance (args)?

 return Class.forName(**complete classname**) .getConstructor(**here pass parameters passed in constructor**) .newInstance(**here pass arguments**); 

В моем случае конструктор моего classа принимает параметр Webdriver как параметр, поэтому используется ниже кода:

 return Class.forName("com.page.BillablePage") .getConstructor(WebDriver.class) .newInstance(this.driver); 
  • Почему рекомендуется использовать reflection в .NET?
  • Получение всех типов в пространстве имен посредством отражения
  • Как вызвать метод суперclassа с использованием отражения Java
  • Вывод типа отражения на Java 8 Lambdas
  • Как вызвать частный статический метод с использованием отражения (Java)?
  • Как узнать, является ли свойство автоматически реализованным свойством с reflectionм?
  • Convert.ChangeType () не работает в Nullable Types
  • Можете ли вы использовать reflection, чтобы найти имя текущего исполняемого метода?
  • используя objc_msgSend для вызова функции Objective C с именованными аргументами
  • Получить общий метод без использования GetMethods
  • Создание собственного внутреннего classа с reflectionм java
  • Давайте будем гением компьютера.