我正在加载一个带有以下语句的类:
Class classToLoad = Class.forName("com.somePackage.SomeotherPackage.classname" );
稍后我将使用反射来获取此类的方法。现在,为了用methodname.invoke((函数调用方法,我需要加载类的对象。因此,我想创建已加载类的对象。我试着这样做:
Object obj = classToLoad.newInstance();
但问题是,通过这种方式,我没有加载类的对象,但我得到了object类的对象。
现在,如果我想调用加载类的函数,我会这样做:
methodName.invoke(obj);
它抛出了一个异常:
java.lang.IollegalArgumentException:对象不是声明类的实例
有人能帮忙吗?
问题更新:
问题是,我需要作业的左手边是不同的类类型,并且该类类型将在运行时中决定
对于以下声明:
对象实例=clazz.newInstance((;
"instance"应该是"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
}
}
我的猜测是,您获取的方法(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();
}
}
}
java.lang.IllegalArgumentException: object is not an instance of declaring class
如果方法没有参数并且在对象的类中找不到,则可以引发此问题。可能您在错误的对象上调用invoke方法,或者您获取的方法对您的对象来说是错误的。
问题是,我需要作业的左手边是不同的类类型,并且该类类型将在运行时决定。。。我怎样才能做到这一点?
使用Java以外的其他语言。Java是静态类型的,这基本上意味着你不能完全按照你刚才要求的去做。这里的其他答案正确地展示了如何在编译时不知道对象类型的情况下调用方法,但你永远无法在运行时设置变量的类型。