public class Deal<T>{ public void getTargetMethod(){
//能不能获得T这个类的实例,或者T里面的方法
}
}假如有上边这个类,能不能通过某种方法在getTargetMethod获得T里面的某一个方法。
有class Person{
   public void eat(){};
}
比如:传入Deal<Person> p=new Deal<Person>();,现在调用p.getTargetMethod(),能不能在方法里回调eat方法,。。求解高手

解决方案 »

  1.   


    public class Deal<T> {
        public void getTargetMethod(T t) {
            try {
                Method method=t.getClass().getMethod("eat");
                method.invoke(t);
            } catch (XXX e) {}
        }
    }Deal<Person> deal=new Deal<Person>();
    deal.getTargetMethod(new Person());
      

  2.   

    我现在想如果没有泛型对象,能不能调用eat那个方法,也不像一楼要传一个参数,直接通过泛型获得相应的方法或字段,。你们看下边这种形式是获得的,只不过这种方式需要继承一下。class Dao<T>{
       public Dao(){
         ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
         clazz = (Class) pt.getActualTypeArguments()[0];
         System.out.println("clazz = " + clazz);//可以打印传过来的泛型信息
       }
    }class AppleDao extends Dao<Apple>{
        //增册改查方法
    }class Apple{
      private String color;
      private String price;
      private String weight;
    }像这样就可以获得相应的泛型信息,却没有泛型对象。求再帮忙
      

  3.   

    LZ,劝你别钻牛角尖了,目前的java做不到
    为什么需要子类才能知道具体的类型?你可以把代码改改就知道了
    class AppleDao extends Dao<T> { //子类在这里继续使用泛型,LZ看看还能拿到具体类型吗? --A 
        //增册改查方法 
    }所以说
    public class Deal<T>{ //这里的T也是泛型,所以
    public void getTargetMethod(){
        //这里能拿到也是T泛型,不是具体类型,和--A的道理一样
        //泛型在编译的时候被擦除,被用Object来代替,可以通过以下代码验证
        try {
            for (TypeVariable tv : this.getClass().getTypeParameters()) {
                System.out.printf("name=%s\n", tv.getName()); //这里得到的是T --B
                for (Type t : tv.getBounds()) { 
                    System.out.printf("class=%s\n", t); ////这里得到的是Object --C
                }
                //如果子类用<Apple>继承,也就是子类用具体类型而不是泛型,那么就如LZ的例子,
                  //--B可能得到的就是Apple,--C处得到的就是Apple的class
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
      

  4.   

    我大致明白你想表达的意思了,可是还是有些混
    //子类在这里继续使用泛型,LZ看看还能拿到具体类型吗? --A 
    什么意思
    我现在明白我的想法是实不了的,除非才用二楼那样传个泛型对象,可是感觉为什么呢,继承都可以,,,,,,,你很棒,,在下佩服。。
      

  5.   

    class   AppleDao   extends   Dao <Apple>
    class AppleDao extends Dao<T> { //子类在这里继续使用泛型,LZ看看还能拿到具体类型吗? --A 注意这两行代码的区别,就知道我说的意思了
    Dao<Apple> 和 Dao<T> 的区别