Java 使用反射的动态对象创建和分配
我正在加载一个包含以下语句的类:Java 使用反射的动态对象创建和分配,java,object,reflection,instance,variable-assignment,Java,Object,Reflection,Instance,Variable Assignment,我正在加载一个包含以下语句的类: Class classToLoad = Class.forName("com.somePackage.SomeotherPackage.classname" ); 后来我使用反射来获取这个类的方法。现在,对于使用methodname.invoke()函数调用方法,我需要加载的类的对象。因此,我想创建加载类的对象。我试着这样做: Object obj = classToLoad.newInstance(); 但问题是,这样我不会加载类的对象,而是得到对象类的对
Class classToLoad = Class.forName("com.somePackage.SomeotherPackage.classname" );
后来我使用反射来获取这个类的方法。现在,对于使用methodname.invoke()函数调用方法,我需要加载的类的对象。因此,我想创建加载类的对象。我试着这样做:
Object obj = classToLoad.newInstance();
但问题是,这样我不会加载类的对象,而是得到对象类的对象
现在,如果我想调用已加载类的函数,我可以这样做:
methodName.invoke(obj);
它抛出一个异常:
java.lang.IllegalArgumentException:对象不是声明类的实例
有人能帮忙吗
有关问题的最新情况:
问题是我需要任务的左侧是不同的类类型,并且该类类型将在运行时决定
对于以下声明:
Class classToLoad = Class.forName("com.somePackage.SomeotherPackage.classname" );
对象实例=clazz.newInstance()
“实例”应为“clazz”类型,而不是“Object”类
如何实现这一点?一切设置正确后,效果良好:
import java.lang.reflect.Method;
class Foo {
public Foo() {
}
public void sayHello() {
System.out.println("Hello");
}
}
public class Test {
public static void main (String[] args) throws Exception {
Class<?> clazz = Class.forName("Foo");
Method method = clazz.getMethod("sayHello");
Object instance = clazz.newInstance();
method.invoke(instance); // Prints Hello
}
}
import java.lang.reflect.Method;
福班{
公共食物({
}
公共空间{
System.out.println(“你好”);
}
}
公共类测试{
公共静态void main(字符串[]args)引发异常{
Class clazz=Class.forName(“Foo”);
方法Method=clazz.getMethod(“sayHello”);
对象实例=clazz.newInstance();
调用(实例);//打印Hello
}
}
我的猜测是,您获取的方法(
methodName
)实际上不是从classToLoad
获取的。您也可以强制转换返回类型并直接调用该方法
public class Foo{
void HelloReflection(){
System.out.println("Hello reflection");
}
public static void main(String[] args){
try{
Foo o = (Foo) Class.forName("Foo").newInstance();
o.HelloReflection();
}catch(Exception e){
e.printStackTrace();
}
}
}
如果该方法没有参数并且在对象的类中找不到,则可以抛出该方法。可能您对错误的对象调用了invoke方法,或者您获取的方法对您的对象来说是错误的
问题是,我需要作业的左侧是不同的类类型,并且该类类型将在运行时决定。。。我怎样才能做到这一点
使用Java以外的语言。Java是静态类型的,这基本上意味着不允许您完全按照您刚才要求的方式进行操作。这里的其他答案正确地显示了如何在编译时调用方法而不知道对象的类型,但是您永远无法在运行时设置变量的类型。好吧,听起来您使用的方法是错误的。请给出一个简短但完整的示例。
classToLoad.newInstance()代码>返回类“存储”int的新实例classToLoad
。您可以通过打印obj.getClass()
进行检查,因此您的问题必须隐藏在其他地方。正如Jon所建议的那样,您应该向我们展示一些代码,我们可以使用这些代码来重现您的错误,或者我们只能猜测可能出现的错误。您试图做的通常是通过拥有一个定义抽象方法的抽象父类来解决,您可以将其用于所有子类的接口:AbstractParentClass obj=(AbstractParentClass)classToLoad.newInstance();