我正在使用urlclassloader在运行时加载jar文件。
Jar文件和类已成功加载。
我有一个带有返回对象X的方法的类。
使用对象X,我必须在X上调用Setter方法。

如何在X上调用setter方法?

我通过调用方法返回了对象X。

X = my.invoke(inst, obj);



我是否需要通过在X类上调用newInstance()方法来再次创建实例?
要调用对象X的方法,是否每次都必须调用method.invoke()
假设X对象有5种方法,请找到该方法并使用Method.invoke.调用该方法


您的建议将非常有帮助。

   File f1 = new File("/home/egkadas/CR364/lib/xxx.jar");
   URL urls [] = new URL[1];
   urls[0] = f1.toURL();

   URLClassLoader urlClass = URLClassLoader.newInstance(urls);
   Class c1 = urlClass.loadClass("com.xxxx.example.poc.Container");
   Container  inst = (Container)c1.newInstance();

   if(inst == null){
        System.out.println("Object is null");
   }else{
     Method my = c1.getMethod("getAttribute",null);
      Object[] obj = new Object[0];
 com.XXXXX.example.poc.Container.Attributes att =(com.XXXXX.example.poc.Container.Attributes)my.invoke(inst, obj);
      System.out.println(att);


罐子里的代码:

公共类容器{

public String id;

public Container(){

}

public Container(String id){
    this.id=id;
}

public void setId(String id){
    this.id=id;
}
public Attributes getAttribute(){
    return new Attributes("check","12lb","15lb",100);
}

public List<Attributes> getAttributes(){
    List<Attributes> ats = new ArrayList<Attributes>();

    return ats;
}

public static class Attributes {
    public String name;
    public String weight;
    public String height;
    public int capacity;

    public Attributes(String name,String weight,String height,int capacity){
        this.name=name;
        this.weight=weight;
        this.height=height;
        this.capacity=capacity;
    }

    public Attributes(){

    }
    public String toString(){
        return this.name+" "+this.weight+"  "+this.height+" "+this.capacity;
    }

    public void setName(String name){
        this.name=name;
    }
    public void setWeight(String weight){
        this.weight =weight;
    }
    public void setHeight(String height){
        this.height=height;
    }

    public void setCapacity(int cap){
        this.capacity=cap;
    }
}


}

最佳答案

我是否需要通过在X类上调用newInstance()方法来再次创建实例?


不,根据您的解释,您已经有一个对象X。您不需要创建任何新类型的对象。


要调用对象X的方法,我是否必须调用method.invoke()
每一次?假设X对象有5种方法,找到方法
并使用Method.invoke调用该方法。


反思是运行时的事情。您不知道要使用的声明(或静态)类型。您基本上只使用Object界面/合同。因此,您需要通过反射实用程序来做所有事情。如果要调用对象的方法,则需要检索相应的Method对象,并使用正确的参数调用其invoke(..)方法。

关于java - Java类加载和反射,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22106270/

10-13 08:16