Sınıf adı (dinamik) verilen belirli bir sınıfın örneğini oluşturmanın ve yapıcısına parametreler geçirmenin bir yolu var mı?
Şöyle bir şey:
Object object = createInstance("mypackage.MyClass","MyAttributeValue");
Burada "MyAttributeValue"
, MyClass
yapıcısının bir argümanıdır.
Evet, şöyle bir şey:
Class<?> clazz = Class.forName(className);
Constructor<?> ctor = clazz.getConstructor(String.class);
Object object = ctor.newInstance(new Object[] { ctorArgument });
Bu elbette yalnızca tek bir dize parametresi için çalışacaktır, ancak bunu oldukça kolay bir şekilde değiştirebilirsiniz.
Sınıf adının tam nitelikli olması gerektiğini, yani ad alanını da içermesi gerektiğini unutmayın. İç içe sınıflar için bir dolar kullanmanız gerekir (derleyici bunu kullanır). Örneğin:
package foo;
public class Outer
{
public static class Nested {}
}
Bunun için Class
nesnesini elde etmek için Class.forName("foo.Outer$Nested")
gerekir.
İstediğiniz sınıftan bir Class
nesnesi elde etmek için Class.forName()
kullanabilirsiniz.
Ardından istenen Constructor
nesnesini bulmak için getConstructor()
kullanın.
Son olarak, yeni örneğinizi almak için bu nesne üzerinde newInstance()
çağrısı yapın.
Class<?> c = Class.forName("mypackage.MyClass");
Constructor<?> cons = c.getConstructor(String.class);
Object object = cons.newInstance("MyAttributeValue");