通过反射获取泛型信息



 1 package com.coscon.reflectionTest;
 2
 3 import java.lang.reflect.Method;
 4 import java.lang.reflect.ParameterizedType;
 5 import java.lang.reflect.Type;
 6 import java.util.List;
 7 import java.util.Map;
 8
 9 //用过反射获取泛型信息
10 public class ReflectionForGenerics {
11     public void test01(Map<String,User> map,List<User> users){
12         System.out.println("test01");
13     }
14
15     public Map<Integer,User> test02(){
16         System.out.println("test02");
17         return null;
18     }
19
20     public static void main(String[] args) {
21         try {
22             Class clazz = Class.forName("com.coscon.reflectionTest.ReflectionForGenerics");
23             //获得指定方法参数泛型信息
24             Method method = clazz.getMethod("test01", Map.class,List.class);
25             //获取泛型参数
26             Type[] types = method.getGenericParameterTypes();
27             for (Type type : types) {
28                 System.out.println("#"+type);
29                 if(type instanceof ParameterizedType){
30                     Type[] actualTypeArguments = ((ParameterizedType) type).getActualTypeArguments();
31                     for (Type type2 : actualTypeArguments) {
32                         System.out.println("泛型参数类型:"+type2);
33                     }
34                 }
35             }
36
37             System.out.println("--------------------------------------------------------------");
38             Method method2 = clazz.getMethod("test02", null);
39             //获取返回值泛型信息
40             Type returnType = method2.getGenericReturnType();
41             System.out.println("#"+returnType);
42             if(returnType instanceof ParameterizedType){
43                 Type[] typeArguments = ((ParameterizedType) returnType).getActualTypeArguments();
44                 for (Type type : typeArguments) {
45                     System.out.println("返回值泛型类型:"+type);
46                 }
47             }
48         } catch (Exception e) {
49             // TODO Auto-generated catch block
50             e.printStackTrace();
51         }
52     }
53 }

打印结果

#java.util.Map<java.lang.String, com.coscon.reflectionTest.User>
泛型参数类型:class java.lang.String
泛型参数类型:class com.coscon.reflectionTest.User
#java.util.List<com.coscon.reflectionTest.User>
泛型参数类型:class com.coscon.reflectionTest.User
--------------------------------------------------------------
#java.util.Map<java.lang.Integer, com.coscon.reflectionTest.User>
返回值泛型类型:class java.lang.Integer
返回值泛型类型:class com.coscon.reflectionTest.User



通过反射获取泛型信息

时间: 2024-10-10 08:39:46

通过反射获取泛型信息的相关文章

c#反射机制学习和利用反射获取类型信息

反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的名称.限定符和参数等.有了反射,即可对每一个类型了如指掌.如果获得了构造函数的信息,即可直接创建对象,即使这个对象的类型在编译时还不知道 1..NET可执行应用程序结构 程序代码在编译后生成可执行的应用,我们首先要了解这种可执行应用程序的结构. 应用程序结构分为应用程序域—程序集—模块—类型—成员几

java 反射和泛型-反射来获取泛型信息

通过指定对应的Class对象,程序可以获得该类里面所有的Field,不管该Field使用private 方法public.获得Field对象后都可以使用getType()来获取其类型. Class<?> type = f.getType();//获得字段的类型 但此方法只对普通Field有效,若该Field有泛型修饰,则不能准确得到该Field的泛型参数,如Map<String,Integer>; 为了获得指定Field的泛型类型,我们采用: Type gType = f.getG

根据反射获取属性信息并创建DataTable

查看了一些方法之后,做了一些总结,此方法适用于传进的参数是List<T>类型, 但事先并不知道T的类型,T可以是自定义类型. 1 public DataTable CreateDataTable(Object o) 2 { 3 DataTable dt = new DataTable(); 4 //DataColumn yearColumn = new DataColumn("Year", System.Type.GetType("System.String&qu

利用反射获取泛型

package com.duchong.aar.reflect.T; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.List; import java.util.Map; public class DemoT { public void test01(Map<String,Integer> m

通过反射获取字段信息

今天写一个参照,由于参照的数量太多,几乎每个单据都会有一个参照,因此我想抽象出一部分基本属性作为基类来继承, 我这么做了,但是数据没出来,看了源代码,发现了原因: 如截图所示,该代码只实现了当前类的属性的读取,但是没有读取父类的属性,提供方法如下来获取所以父类属性 很好理解,不断读取父类,直到遇到java.lang.object,我们就认为我们读取完了所有自己的父类的属性,当然,你是用了这个方法 注定只能是object的子类,其余的情况可以分开讨论,比如加一个接口来区分一下,然后分流读取即可

反射获取类结构信息

代码如下: 1 package com.sina.demo; 2 interface IMessageService{ 3 public void send(); 4 } 5 interface IChannel{ 6 public boolean connect(); 7 } 8 abstract class AbstractBase{} 9 class Mail extends AbstractBase implements IMessageService,IChannel{ 10 @Ove

自定义注解以及通过反射获取注解

一.自定义的注解 @Target({ElementType.METHOD,ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface jdbcConfig { String ip(); int port() default 3306; String database(); String encoding(); String username(); String pa

Java之反射机制六:获取方法的泛型信息

一.测试类 public class Test02 { public void parameterTest(Map<Integer, Dog> map){ } public Map<Integer,Dog> returnTest(){ return new HashMap<Integer, Dog>(); } } 二.获取方法的参数中的泛型信息 @Test //获取方法的参数中的泛型信息 public void test() throws NoSuchMethodExc

获取泛型的class 反射

最近在使用Google的Gson包进行Json和Java对象之间的转化,对于包含泛型的类的序列化和反序列化Gson也提供了很好的支持,感觉有点意思,就花时间研究了一下. 由于Java泛型的实现机制,使用了泛型的代码在运行期间相关的泛型参数的类型会被擦除,我们无法在运行期间获知泛型参数的具体类型(所有的泛型类型在运行时都是Object类型). 但是有的时候,我们确实需要获知泛型参数的类型,比如将使用了泛型的Java代码序列化或者反序列化的时候,这个时候问题就变得比较棘手. ? 1 2 3 4 5