zoukankan      html  css  js  c++  java
  • 反射与泛型--使用泛型反射API打印出给定类的所有内容

    package chapter8Demos;
    
    import java.lang.reflect.*;
    import java.util.Arrays;
    import java.util.Scanner;
    import source.*;
    public class GenericReflectionTest {
    
        public static void main(String[] args) {
            String name;
            if (args.length > 0) {
                name = args[0];
            }
            else {
                try (Scanner in = new Scanner(System.in)){
                    System.out.println("Enter class name (e.g. java.util.Collections): ");
                    name = in.next();
                }
            }
            //反射手动输入的这个类
            try {
                Class<?> cl = Class.forName(name);
                //输出类的信息
                printClass(cl);
                for (Method m : cl.getDeclaredMethods()) {
                    printMethod(m);                
                }
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
    
        }
        //输出关于类的信息
        public static void printClass(Class<?> cl) {
            System.out.print(cl);
            //输出泛型
            printTypes(cl.getTypeParameters(),"<",",",">",true);
            //输出父类
            Type sc = cl.getGenericSuperclass();
            if (sc != null) {
                System.out.print(" extends ");
                printType(sc,false);
            }
            //输出实现的接口
            printTypes(cl.getGenericInterfaces()," implements ",", ","",false);
            System.out.println();
        }
        //输出类中定义的方法
        public static void printMethod(Method m) {
            String name = m.getName();
            //Modifier 修饰语
            System.out.print(Modifier.toString(m.getModifiers()));
            System.out.print(" ");
            printTypes(m.getTypeParameters(), "<", ",", ">", true);
            
            printType(m.getGenericReturnType(), false);
            System.out.print(" ");
            System.out.print(name);
            System.out.print("(");
            printTypes(m.getGenericParameterTypes(), "", ", ", "", false);
            System.out.println(")");
        }
        private static void printType(Type type, boolean isDefinition) {
            if (type instanceof Class) {
                Class<?> t = (Class<?>) type;
                System.out.print(t.getName());
            }
            //描述类型变量
            else if(type instanceof TypeVariable) {
                TypeVariable<?> t = (TypeVariable<?>) type;
                System.out.print(t.getName());
                if (isDefinition) {
                    //getBounds获取类型变量的上边界, 若未明确声明上边界则默认为Object
                    printTypes(t.getBounds(), " extends ", " & ", "", false);
                }
            }
            //wildcard 通配符
            else if (type instanceof WildcardType) {
                WildcardType t = (WildcardType) type;
                System.out.print("?");
                printTypes(t.getUpperBounds(), " extends ", " & ", "", false);
                printTypes(t.getLowerBounds(), " super ", " & ", "", false);
            }
            //描述泛型类或接口类型
            else if (type instanceof ParameterizedType) {
                ParameterizedType t = (ParameterizedType) type;
                Type owner = t.getOwnerType();
                if (owner != null) {
                    printType(owner, false);
                    System.out.print(".");
                }
                printType(t.getRawType(), false);
                printTypes(t.getActualTypeArguments(), "<", ",", ">", false);
            }
            //描述泛型数组
            else if (type instanceof GenericArrayType) {
                GenericArrayType t = (GenericArrayType) type;
                System.out.print("");
                printType(t.getGenericComponentType(),isDefinition);
                System.out.print("[]");
            }
        }
        //通用打印,可以处理继承、接口、参数的打印 
        //isDefinition输入true则表明该参数变量已经打印完全了,输入false则表明该参数变量还可以被打印的更准确
        private static void printTypes(Type[] types, String pre, String sep, String suf,
                boolean isDefinition) {
            if (pre.equals(" extends ") && Arrays.equals(types, new Type[] {Object.class})) {
                return ;
            }
            if (types.length > 0) {
                System.out.print(pre);
            }
            //顺序打印
            for (int i = 0; i < types.length; i++) {
                if (i > 0) {
                    System.out.print(sep);
                }
                printType(types[i], isDefinition);
            }
            if (types.length > 0) {
                System.out.print(suf);
            }
        }
    }

    JAVA核心技术8-4

  • 相关阅读:
    2015/8/28 回校正常学习工作
    Asp.net自定义控件开发任我行(3)-Render
    Asp.net自定义控件开发任我行(2)-TagPrefix标签
    Asp.net自定义控件开发任我行(1)-笑傲江湖
    ET采集阿里妈妈淘宝客商品规则
    淘宝API还能用来采集数据吗?taobao.item.get 接口还能用吗?
    淘宝api升级,无法采集淘宝的数据,taobao.item.get 和taobao.taobaoke.items.get都不能用
    用firefox浏览器访问localhost,apache http server 已停止工作
    淘宝客网站怎么批量采集淘宝商品,方维采集淘宝数据思路
    方维购物分享系统怎么样,方维系统安全性检测
  • 原文地址:https://www.cnblogs.com/Joey777210/p/11851589.html
Copyright © 2011-2022 走看看