这可能是一个愚蠢的问题,但我是Java的新手,所以......
我目前有一些代码,目前正在使用它
clazz.asSubclass(asSubclassOfClass).getConstructor().newInstance()
我需要将一些参数传递给contructort,所以我想将其更改为:clazz.asSubclass(asSubclassOfClass).getConstructor(params).newInstance(args)
我不理解的是我需要传递的内容 params 以及我需要传递的内容 args 。
假设我想传入一个字符串“howdy”和一些名为XyzObj的XYZ类型的对象。我将如何指定?我会以params的形式通过什么,以及作为args传递给我的是什么?
答案 0 :(得分:44)
在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");
希望这有助于您理解它。
答案 1 :(得分:5)
以下是使用new关键字创建类的示例。 这些类将其他类作为基元和对象作为其参数。 该示例还显示了子类的实例和正在创建的Parent类
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 {}
希望这很有用
亲切的问候
Naresh Maharaj
答案 2 :(得分:3)
clazz.asSubclass(asSubclassOfClass)
.getConstructor(String.class, XYZ.class)
.newInstance("howdy", XyzObj)
假设构造函数args采用指定的顺序