java 泛型 反射

通过类上指定的泛型

public class TestCall1<T, R> {

    public T c(R t) {
        return null;
    }
}
public class TestCall2<T,R> extends TestCall1<T,R> {
}

测试类

 @Test
    public void test3() {
        TestCall1 testCall1 = new TestCall1<Integer, String>() {
        };
        TestCall1 testCall2 = new TestCall1<Integer, String>();
        Type type1 = testCall1.getClass().getGenericSuperclass();
        System.out.println(type1);
        Type type2 = testCall2.getClass().getGenericSuperclass();
        System.out.println(type2);
        if (type1 instanceof ParameterizedType) {
            ParameterizedType parameterizedType = (ParameterizedType) type1;
            System.out.println(parameterizedType.getActualTypeArguments()[0]);
            System.out.println(parameterizedType.getActualTypeArguments()[1]);
        }
    }

com.hj.tl.driver.TestCall1<java.lang.Integer, java.lang.String>
class java.lang.Object
class java.lang.Integer
class java.lang.String
 @Test
    public void test3() {
        TestCall1 testCall1 = new TestCall2<Integer, String>() {
        };
        TestCall1 testCall2 = new TestCall2<Integer, String>();
        Type type1 = testCall1.getClass().getGenericSuperclass();
        System.out.println(type1);
        Type type2 = testCall2.getClass().getGenericSuperclass();
        System.out.println(type2);
        if (type1 instanceof ParameterizedType) {
            ParameterizedType parameterizedType = (ParameterizedType) type1;
            System.out.println(parameterizedType.getActualTypeArguments()[0]);
            System.out.println(parameterizedType.getActualTypeArguments()[1]);
        }
    }

com.hj.tl.driver.TestCall2<java.lang.Integer, java.lang.String>
com.hj.tl.driver.TestCall1<T, R>
class java.lang.Integer
class java.lang.String

说明

1、new TestCall2<Integer, String>() { }
是新建了个子类 其类型class com.hj.tl.driver.ExampleUnitTest$2

2、getClass().getGenericSuperclass()
是获得父类的类型 注返回的有个java.lang.Object

通过method的方式获取不到

 @Test
    public void test4() {
        TestCall1 call1 = new TestCall1<Integer, String>() {
            @Override
            public Integer c(String t) {
                return super.c(t);
            }

            @Override
            public Integer mm() {
                return super.mm();
            }
        };
        TestCall1 call2 = new TestCall1<Integer, String>();
        try {
            Method[] method1 = call1.getClass().getMethods();
            System.out.println(Arrays.toString(method1));
            Method[] method2 = call2.getClass().getMethods();
            System.out.println(Arrays.toString(method2));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
Paste_Image.png

发现只有重写了方法 才能获取到

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,779评论 18 399
  • (一)Java部分 1、列举出JAVA中6个比较常用的包【天威诚信面试题】 【参考答案】 java.lang;ja...
    独云阅读 7,144评论 0 62
  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 4,291评论 0 16
  • 在经过一次没有准备的面试后,发现自己虽然写了两年的android代码,基础知识却忘的差不多了。这是程序员的大忌,没...
    猿来如痴阅读 2,877评论 3 10
  • 当你前进时,你会听到很多声音。声音来自不同的人,声音各不相同,有的有目的,有的没目的,可能仅仅是说说而已。有目的的...
    海客曰阅读 1,047评论 0 3