Как использовать getConstructor (params).newInstance(args)?
Это может быть глупый вопрос, но я новичок в Java, поэтому...
В настоящее время у меня есть код, clazz.asSubclass(asSubclassOfClass).getConstructor().newInstance()
используется. Мне нужно передать некоторые аргументы, поэтому я хочу изменить его на: clazz.asSubclass(asSubclassOfClass).getConstructor(params).newInstance(args)
. Я не понимаю, что мне нужно передать в качестве параметров и что мне нужно передать в качестве аргументов. Скажем, я хотел передать строку "howdy" и некоторый объект типа XYZ, называемый XyzObj in. Как бы это указать? Что бы я передал как params и что бы я передал как args?
Ответы
Ответ 1
В Java это называется Reflection.
Предполагая, что класс имеет этот конструктор, в противном случае вы получите исключение NoSuchMethod, которое я считаю.
clazz.asSubclass(asSubclassOfClass)
.getConstructor(String.class,XYZ.class)
.newInstance("howdy",XyzObj);
Поскольку вы новичок в Java, позвольте мне рассказать вам проще, чтобы вы могли понять, что происходит под капотом, когда вы это делаете.
Предположим, что у вас есть следующий класс:
public class ParentClazz{
String someVar;
public ParentClazz(){
someVar="test";
}
public ParentClazz(String someVar){
System.out.println("I have been invoked");
this.someVar=someVar;
}
}
Затем у вас есть следующий основной метод:
public static void main(String[] args) throws ParseException, IllegalArgumentException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
ParentClazz.class.asSubclass(ParentClazz.class).getConstructor(String.class).newInstance("howdy");
}
Если вы запустите это, вы увидите сообщение вывода вывода на консоль - я был вызван. Это означает, что при использовании рефлексии вы вызывали конструктор ParentClazz.
Вы можете сделать то же самое, если сценарий позволяет вам использовать стандартный процесс создания объекта:
ParentClazz clazz = new ParentClazz("howdy");
Надеюсь, это поможет вам понять это.
Ответ 2
Вот пример создания классов без нового ключевого слова.
Классы принимают в качестве своих параметров другие классы как примитивы, так и объекты.
В этом примере также показан экземпляр подкласса и создаваемого родительского класса
public class ConstructorInstantiateWithoutNew
{
@SuppressWarnings("rawtypes")
public static void main( String [] args )
{
Class<Drinker> clazz_drinker = Drinker.class;
Class [] paramTypes = { Fizz.class, Colour.class, int.class };
Object [] paramValues = { new Fizz(), new Colour(), new Integer(10) };
Class<Drunk> clazz_drunk = Drunk.class;
Class [] paramTypesSub = { Fizz.class, Colour.class, int.class, boolean.class };
Object [] paramValuesSub = { new Fizz(), new Colour(), new Integer(10), true };
try
{
Drinker drinker = clazz_drinker.getConstructor( paramTypes ).newInstance( paramValues );
drinker.drink();
Drunk drunk = clazz_drunk.getConstructor(paramTypesSub).newInstance(paramValuesSub);
drunk.drink();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
class Drinker
{
int n;
public Drinker( Fizz f, Colour c, int n)
{
this.n = n;
}
public void drink()
{
System.out.println( "Dad drank " + (n*10) + " ml");
}
}
class Drunk extends Drinker
{
boolean trouble;
public Drunk(Fizz f, Colour c, int n, boolean inDogHouse)
{
super(f,c,n);
trouble = inDogHouse;
}
public void drink()
{
System.out.println(
"Dad is Grounded: " + trouble +
" as he drank over "+
(n*10) + " ml");
}
}
class Fizz {} class Colour {}
Надеюсь, это полезно
С уважением
Нареш Махарадж
Ответ 3
clazz.asSubclass(asSubclassOfClass).getConstructor(String.class, XYZ.class).newInstance("howdy", XyzObj)
Предполагается, что аргументы конструктора находятся в указанном порядке
Ответ 4
Вы использовали бы clazz.asSubclass(asSubclassOfClass).getConstructor(String.class, XYZ.class).newInstance("howdy", XyzObj);