我有个List<E> 对象,E的类型未知
假如List.size()>1
Object obj = list.get(0);
-----------------------------
1.得到obj的类型:String className = obj.getClass().getName();
2.我这有N多实体,比如Student.class Teacher.class……
3.Student.class里面有方法addStudent();
4.Teacher.class里面有方法addTeacher();
问题是:
1.我想通过反射自动把obj强制转换成对应的E对象,应该怎么写?
2.我如何根据对象调用该类型对象的方法,比如如果obj的className是Student,然后把obj强制转换成student,再调用student.addStudent()方法?
先谢过,请不吝赐教!

解决方案 »

  1.   

    我现在想根据传入的属性调用该属性对应的getter方法
      

  2.   

    Object obj = list.get(0);String className = obj.getClass().getName(); className  aa = (className)obj.getClass();
    有这种实现吗???
      

  3.   

    写了个小方法,楼主看看吧
    package test;import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.ArrayList;
    import java.util.List;public class Test { /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    List a = new ArrayList();
    Object[] d = new String[3];//方法参数
    try {
    Class c = Class.forName((String) a.get(0));
    Method[] b = c.getMethods();
    for(int i=0;i<b.length;i++){
    if(b[i].getName().indexOf("add")!=-1){
    b[i].invoke(c, d);
    }
    }
    } catch (ClassNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IllegalArgumentException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IllegalAccessException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (InvocationTargetException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }}
      

  4.   

    b[i].invoke(c, d);方法能够返回该方法return的值么?主要是这个
      

  5.   

    invoke 方法有返回一个 Object 的值,这就是方法的返回值,如果没返回值则返回null
      

  6.   

    典型的方法命名问题
    Student的方法就叫add,为何还要加个addStudent???
    自己找麻烦。
      

  7.   


    Student:
    public class Student {
    public void add(){
    System.out.println("Student add...");
    }
    }
    Teacher:
    public class Teacher {
    public void add(){
    System.out.println("Teacher add...");
    }
    }Test:
    import java.lang.reflect.InvocationTargetException;
    import java.util.ArrayList;
    import java.util.List;
    public class Test { /**
     * @param args
     * @throws Exception 
     * @throws InvocationTargetException 
     * @throws IllegalAccessException 
     * @throws SecurityException 
     * @throws IllegalArgumentException 
     */
    public static void main(String[] args) throws IllegalArgumentException, SecurityException, IllegalAccessException, InvocationTargetException, Exception {
    // TODO Auto-generated method stub
    List list = new ArrayList();
    Student s = new Student();
    Teacher t = new Teacher();
    list.add(s);
    list.add(t);

    for(int i=0 ; i<list.size() ; i++){
    Object o = list.get(i);
    o.getClass().getMethod("add").invoke(o);
    }
    }}
      

  8.   

    如果用反射的话,是不用做类型转换的。只有硬编码的时候需要做这样的类型转换。
    得到class以后,就可以根据它来找你想要的方法。
    然后直接invoke就OK了。