我正在用以下语句加载一个类:
Class classToLoad = Class.forName("com.somePackage.SomeotherPackage.classname" );稍后,我将使用反射来获取该类的方法。现在,为了用methodname.invoke()函数调用方法,我需要加载类的对象。因此,我希望创建已加载类的对象。我试着这样做:
Object obj = classToLoad.newInstance();但问题在于,这样我就没有加载类的对象,而是得到对象类的对象。
现在,如果我想调用已加载类的函数,我会这样做:
methodName.invoke(obj);它抛出一个异常:
java.lang.IllegalArgumentException: object不是声明类的实例
有人能帮忙吗?
有关问题的最新情况:
问题是,我需要分配的左边是一个不同的类类型,这个类类型将在运行时决定。
关于下列声明:
对象实例= clazz.newInstance();
“实例”应该是"clazz“类型,而不是"Object”类。
我怎样才能做到这一点?
发布于 2013-02-27 18:48:01
当所有设置都正确时,它可以正常工作:
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中获取的。
发布于 2013-02-27 18:49:30
您还可以直接转换返回类型并调用该方法。
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();
}
}
}发布于 2013-02-27 18:53:40
java.lang.IllegalArgumentException: object is not an instance of declaring class如果该方法没有参数,并且在对象的类中找不到,则可以抛出此选项。可能是在错误的对象上调用invoke方法,或者您的获取方法对对象来说是错误的。
https://stackoverflow.com/questions/15119725
复制相似问题