这可能是个愚蠢的问题,但我对Java并不熟悉,所以.
我现在有一些代码,目前正在使用clazz.asSubclass(asSubclassOfClass).getConstructor().newInstance()
我需要将一些参数传递给结构,所以我想将它更改为:clazz.asSubclass(asSubclassOfClass).getConstructor(params).newInstance(args)
我不明白的是,我需要作为params传入什么,以args的身份传递什么。
假设我想传递一个字符串"howdy“,并输入一些名为XyzObj in的XYZ类型的对象。我该如何具体说明呢?WHat,我会作为仿射传递,而作为args,我会传递什么?
发布于 2012-02-17 21:28:26
在Java中,这被称为反射。
假设类有这个构造函数,否则您将得到一个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");
}如果您运行此操作,您将注意到控制台输出的打印消息-I已被调用。这意味着使用反射调用了ParentClazz的构造函数。
如果场景允许您使用标准对象创建过程,您可以做同样的事情:
ParentClazz clazz = new ParentClazz("howdy");希望这能帮你理解。
发布于 2013-10-24 15:36:44
下面是一个不使用新关键字创建类的示例。这些类接受其他类,包括原语和对象作为它们的参数。该示例还显示了正在创建的子类和父类的实例。
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 {}希望这是有用的
亲切的问候
纳雷什·马哈拉
发布于 2012-02-17 21:22:40
clazz.asSubclass(asSubclassOfClass)
.getConstructor(String.class, XYZ.class)
.newInstance("howdy", XyzObj),它假定构造函数args按照指定的顺序运行。
https://stackoverflow.com/questions/9335515
复制相似问题