java使用反射调用类方法

我现在的程序如下:

 public class Ob {
    private String classPath;
    private String methodName;
    private Map<String, Object> para;

}
class Demo2 {
    public void print(String string) {
        System.out.print(string+"demo2");
    }
}
class Demo {
    public void print(String string,int i) {
        System.out.print(string+i+"demo1");
    }
}

我想编写一个方法:它接收ob对象,根据ob对象的属性反射调用其他类的方法,调用的实参由ob的para获得. 我想到的是使用map设置实参,或者你有更好的办法也可以.
请问如何实现?可以帮我完成这个demo么?

public static void main(String[] args) throws Exception {
// Ob ob = new Ob("test.pd.Demo2","print","hahaha");
Ob ob = new Ob("test.pd.Demo","print","hahaha",25);
Class<?> cal = Class.forName(ob.getClassPath());
System.out.println("cal:"+cal);
Object[] params = ob.getPara();
List> cals = new ArrayList>(params.length);
for (Object param : params) {
cals.add(param.getClass());
}
Method method = cal.getMethod(ob.getMethodName(),cals.toArray(new Class[]{}));
System.out.println(method);
method.invoke(cal.newInstance(),params);
}

注意:将public void print(String string,int i)修改为public void print(String string,Integer i)

public class Ob {
private String classPath;
private String methodName;
private Haha para;

}
class Haha(){}
class Demo2 extends Haha {
public void print(String string) {
System.out.print(string+"demo2");
}
}
class Demo extends Haha{
public void print(String string,int i) {
System.out.print(string+i+"demo1");
}
}
main()
{
Ob o=new Ob();
Haha a=new Demo();
Haha b=new Demo2();
o.setHaha(a);
o.getHaha().print();
o.setHaha(b);
o.getHaha().print();
}

你看看注解反射原理应该就能理解了,OB属性 值等同于注解的类型,比较的流程 类获取到后反射获取到类的所有方法,比较调用就是了

public class UserBean {

private Integer id;

private int age;

private String name;

private String address;

public UserBean(){  
   System.out.println("实例化");  
}  

public Integer getId() {  
   return id;  
}  
public void setId(Integer id) {  
   this.id = id;  
}  
public int getAge() {  
   return age;  
}  
public void setAge(int age) {  
   this.age = age;  
}  
public String getName() {  
   return name;  
}  
public void setName(String name) {  
   this.name = name;  
}  
public String getAddress() {  
   return address;  
}  
public void setAddress(String address) {  
   this.address = address;  
}  

}

2 > 反射测试

package com.whbs.test;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

import com.whbs.bean.UserBean;

public class Test1 {

public static void main(String[] args) throws Exception {  


   /* 
    * 实列化类 方法1 
    */  
   //String classPath = "com.whbs.bean.UserBean";  
   //Class cla = Test1.class.getClassLoader().loadClass(classPath);  
   //Object ob = cla.newInstance();  

   /* 
    * 实列化类 方法2 
    */  
   UserBean bean = new UserBean();  
   bean.setId(100);  
   bean.setAddress("武汉");  

   //得到类对象  
   Class userCla = (Class) bean.getClass();  

   /* 
    * 得到类中的所有属性集合 
    */  
   Field[] fs = userCla.getDeclaredFields();  
   for(int i = 0 ; i < fs.length; i++){  
       Field f = fs[i];  
       f.setAccessible(true); //设置些属性是可以访问的  
       Object val = f.get(bean);//得到此属性的值     

       System.out.println("name:"+f.getName()+"\t value = "+val);  

       String type = f.getType().toString();//得到此属性的类型  
       if (type.endsWith("String")) {  
          System.out.println(f.getType()+"\t是String");  
          f.set(bean,"12") ;        //给属性设值  
       }else if(type.endsWith("int") || type.endsWith("Integer")){  
          System.out.println(f.getType()+"\t是int");  
          f.set(bean,12) ;       //给属性设值  
       }else{  
          System.out.println(f.getType()+"\t");  
       }  

   }  


   /* 
    * 得到类中的方法 
    */  
   Method[] methods = userCla.getMethods();  
   for(int i = 0; i < methods.length; i++){  
       Method method = methods[i];  
       if(method.getName().startsWith("get")){  
          System.out.print("methodName:"+method.getName()+"\t");  
          System.out.println("value:"+method.invoke(bean));//得到get 方法的值  
       }  
   }  
}  

}

补充一下,可变参数使用Object...接收就行
public class Ob {
private String classPath;
private String methodName;
private Object[] para;

public Ob(String classPath, String methodName, Object... para) {
    this.classPath = classPath;
    this.methodName = methodName;
    this.para = para;
}
}