`
dreamstone
  • 浏览: 288497 次
  • 来自: ...
文章分类
社区版块
存档分类

利用反射取得泛型信息

阅读更多

一、传统通过反射取得函数的参数和返回值

import  java.lang.reflect.Method;
import  java.lang.reflect.ParameterizedType;
import  java.lang.reflect.Type;
import  java.util.ArrayList;
import  java.util.Map;
import  java.util.List;
import  java.util.Set;
 

import  sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl;
 
public   class  Foo {
    
public   static   void  main(String[] args)  throws  Exception  {
     Method[] methods 
=  Foo. class .getDeclaredMethods();
     
for (Method method : methods) {
      Class[] paramTypeList 
=  method.getParameterTypes();
      
      Class returnType 
=  method.getReturnType();
      System.out.println(returnType);
      
for (Class clazz:paramTypeList) {
          System.out.println(clazz);
      }

      System.out.println();
     }

 }

    
public   static  String test1(String str) {
     
return   null ;
    }

    
public   static  Integer test2(String str,Integer i) {
     
return   null ;
    }

   
}



二、在有泛型的时候,取得参数和返回值的集合类的泛型信息

import  java.lang.reflect.Method;
import  java.lang.reflect.ParameterizedType;
import  java.lang.reflect.Type;
import  java.util.ArrayList;
import  java.util.Map;
import  java.util.List;
import  java.util.Set;

import  sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl;

public   class  Foo  {
    
public   static   void  main(String[] args)  throws  Exception  {
        Method[] methods 
=  Foo. class .getDeclaredMethods();
        
for  (Method method : methods)  {
            System.out.println(
" returnType: " );
            Type returnType 
=  method.getGenericReturnType();
            
if  (returnType  instanceof  ParameterizedType) {
                Type[] types 
=  ((ParameterizedType)returnType).getActualTypeArguments();
                
for (Type type:types) {
                    System.out.println(type);
                }

            }

            System.out.println(
" paramTypeType: " );
            Type[] paramTypeList 
=  method.getGenericParameterTypes();
            
for  (Type paramType : paramTypeList)  {
                
if  (paramType  instanceof  ParameterizedType) {
                    Type[] types 
=  ((ParameterizedType)paramType).getActualTypeArguments();
                    
for (Type type:types) {
                        System.out.println(type);
                    }

                }

            }

        }

    }


    
public   static  List < String >  test3(List < Integer >  list)  {
        
return   null ;
    }


    
private   static  Map < String, Double >  test4(Map < String, Object >  map)  {
        
return   null ;
    }


}

三、应用环境
例如你要写一个程序,需求把一个如下的配置文件变成一个集合类。

< config name = " Foo.DoubleBean " >
    
< element key = " key1 "  value = " 1.1 " />
    
< element key = " key2 "  value = " 2.2 " />
    
< element key = " key3 "  value = " 3.3 " />
</ config >

根据用户的参数变成不同的集合类 Map<String.String>     Map<String,Double>   Map<String,Float>
如果你要着手开发一个框架,这样的需求会比较常见。这个时候取到setXX()函数的参数,就可以对应上边的问题了。



dreamstone 2007-02-10 23:24 发表评论
分享到:
评论

相关推荐

    Java基础入门四泛型反射注解.pdf

    在Java基础入门四泛型、反射、注解的学习中,我们会了解到如何正确使用泛型来创建更加健壮的代码,如何利用反射机制实现类和对象的动态操作,以及如何利用注解来简化开发过程和提高代码的可读性。 此外,文档中提到...

    java反射机制详解

    2. **通过反射取得并修改数组的信息**:例如获取数组长度或更改数组元素的值。 3. **通过反射机制修改数组的大小**:虽然Java数组的大小是固定的,但可以通过反射改变数组引用指向另一个数组来间接实现。 4. **将...

    java放射技术培训课件

    对于`Java反射机制的深入研究笔记.pdf`,这部分内容可能涉及更高级的反射操作,比如动态调用方法(`invoke()`方法)、修改私有成员变量、处理泛型信息、以及异常处理等。同时,它可能也会讲解反射与性能的影响,以及...

    精通.NET核心技术高级特性

    反射利用元数据动态地创建对象、调用方法等,增强了代码的灵活性。 7. **反射**:反射是.NET中的一个强大工具,可以动态地获取和操作程序集、类型、成员等信息。它可以用于动态加载类、创建对象、调用方法,是实现...

    CLRviaCsharpC#高级技术

    元数据提供了关于程序集、类型和成员的信息,反射则允许在运行时动态地获取和操作这些信息,自定义属性则可以为代码添加额外的元信息。 在实际开发中,理解这些高级技术能够帮助开发者解决复杂问题,提高代码质量,...

    等级考试java上机模拟软件

    7. **反射机制**:运行时动态加载类、获取类信息、创建对象等。 8. **泛型**:理解泛型的概念,使用泛型类和泛型方法。 9. **JavaSE API**:熟悉并能熟练运用Java标准库提供的各种类和方法。 10. **设计模式**:了解...

    SCJP 310-065 310-055 题库 合集

    8. **反射**:反射的原理和应用,如何在运行时获取类的信息并动态调用方法。 9. **枚举与注解**:枚举类型的特点和使用,注解的定义和使用场景。 10. **JVM与编译过程**:了解Java虚拟机的工作原理,以及源代码到...

    Java程序设计试卷

    - **注解(Annotation)**:了解注解的定义,元注解,以及如何使用反射获取注解信息。 每一套试题都将综合这些知识点,通过解答,考生不仅能检验自己的Java编程能力,还能发现知识盲区,有针对性地进行复习。因此...

    scjp 考试练习题

    7. **反射**:反射机制允许程序在运行时动态地获取类的信息并调用其方法,这是Java的一个强大特性,考试可能会涉及Class类、Constructor、Method和Field的使用。 8. **Java内存管理**:理解垃圾收集(Garbage ...

    java高级编程指导

    这涵盖了多线程、网络编程、IO流、反射、注解、泛型、集合框架、异常处理、设计模式等多个核心主题。在Java的世界里,高级编程意味着理解并能够熟练运用这些复杂但强大的工具和技术,以提升代码的效率、可维护性和可...

    强类型面向对象动态SQL生成器的设计与实现.pdf

    在实现过程中,Wiz框架充分利用了Java的反射机制和泛型,确保了类型安全。它允许开发者通过对象操作来生成SQL,例如,可以通过对象属性来设置WHERE子句的条件,通过对象方法来执行CRUD(创建、读取、更新、删除)...

    SCJP 辅 助 题

    9. **反射**:学习如何在运行时动态获取类的信息,创建对象,调用方法,以及修改私有属性。 10. **泛型**:理解泛型的引入,如何在类、接口、方法中使用泛型,以及通配符的使用。 11. **枚举与注解**:掌握枚举...

    java模拟试题 可以考考自已学的怎么样哦

    8. **反射**:理解反射机制,知道如何在运行时动态获取类的信息并调用其方法。 9. **泛型**:测试你对泛型的理解,包括其作用、限制和如何提高代码的类型安全。 10. **JVM**:理解Java虚拟机的工作原理,包括类...

    C#高级工程师培训8

    - **元数据与反射**:探索.NET框架的元数据系统,学习如何使用反射动态地访问和操作程序集、类型和成员。 4. **LINQ(Language Integrated Query)** - **查询表达式**:学习使用查询表达式语法进行数据库、集合...

    JAVA_JDK_1_6

    还有,增强了反射机制,提供了对泛型类型信息的访问,使得动态编程更具灵活性。 再者,Java 1.6在Swing和AWT图形用户界面库上也有所增强。新的LookAndFeel设计,如Nimbus,提供了更现代的界面风格。同时,增加了对...

    Java编程入门学习资料

    14. **反射机制**:利用反射可以在运行时动态地获取类的信息并操作类的对象,增强程序的灵活性。 15. **JVM原理**:理解Java虚拟机的工作机制,包括类加载、垃圾回收、内存管理等。 最后,提供的"java入门基础.pdf...

    Java基础教程

    - **动态代理**:利用反射实现动态代理,可以在运行时创建代理类,用于拦截方法调用。 8. **Java标准库** - **JDBC**:Java数据库连接,用于与各种数据库进行交互。 - **网络编程**:Socket和ServerSocket类提供...

    刘凯老师教学视频

    - **反射机制**:通过Class类获取对象的类信息,并通过反射创建对象、调用方法等高级操作。 - **泛型**:了解如何使用泛型来提高代码的重用性和类型安全性。 - **注解**:注解的定义及其用途,例如元注解、自定义...

    think-in-java.rar

    8. **反射与注解**:反射允许程序在运行时检查类、接口、字段和方法的信息,而注解则提供了一种元数据的方式,可以用来在编译时或运行时处理代码。 9. **Java标准库**:Java SE(标准版)提供了大量的内置库,如...

    C#上机考试题目

    9. **反射**:反射允许在运行时检查和使用程序集、类型、方法等信息,是实现动态代码执行的重要工具。 10. **泛型**:泛型提供了一种方式来创建类型安全且可重用的数据结构和方法,避免了类型转换的开销。 11. **...

Global site tag (gtag.js) - Google Analytics