java 泛型 反射

2017-04-27  本文已影响78人  proud2008

通过类上指定的泛型

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

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

上一篇下一篇

猜你喜欢

热点阅读