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

反射与泛型--使用泛型反射API打印出给定类的所有内容的更多相关文章

  1. java里如何实现循环打印出字符或字符数组里的内容

    不多说,直接上干货! java里如何实现循环打印出字符里的内容 没写,暂时不会 java里如何实现循环打印出字符数组里的内容 public class test { public static voi ...

  2. java里如何实现循环打印出字符串或字符串数组里的内容

    不多说,直接上干货! java里如何实现循环打印出字符串里的内容 思路:可以先将字符串转换成字符串数组. public class test { public static void main(Str ...

  3. java 反射,注解,泛型,内省(高级知识点)

     Java反射 1.Java反射是Java被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运行时透过Reflection APIs    取得任何一个已知名称的class的内部信息, 包括 ...

  4. Java基础---Java---基础加强---内省的简单运用、注解的定义与反射调用、 自定义注解及其应用、泛型及泛型的高级应用、泛型集合的综合

    内省的简单运用: JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则. 采用遍历BeanInfo的所有属性方式来查找和 ...

  5. 获取泛型的class 反射

    最近在使用Google的Gson包进行Json和Java对象之间的转化,对于包含泛型的类的序列化和反序列化Gson也提供了很好的支持,感觉有点意思,就花时间研究了一下. 由于Java泛型的实现机制,使 ...

  6. Dao泛型设计和反射反型

    (1)DAO泛型设计:当二哥或多个类中有类似的方法时,可以将这些累死的方法提出到类中,形式一个泛型父类 (2)反射反型:在泛型父类中获取子类的具体类型的过程,叫反射反型 package cn.itca ...

  7. java反射机制,以及对反射机制的了解,如有差池欢迎点评(初学者勿喷)

    本人学习java时间不长,但是对java很感兴趣,知道有博客园这个平台果断的注册,记录我的java成长日记,这也是我的处女作,虽然很菜但是还是希望大家能见证我的成长,觉得可以的可以和我讨论一起学习 在 ...

  8. java反射机制,以及对反射机制的了解

    反射是什么?反射有什么用?我相信大家在开始学的时候都会有疑惑,直到如今我学的还不够深入只能简单的说说反射的作用,理论的我也听得很迷糊,接下来我就以几个例子来 写写反射的用处: 494696003群,有 ...

  9. JavaSE学习总结(十六)—— 泛型与泛型应用

    一.泛型概要 泛型(Generic)的本质是类型参数化,通俗的说就是用一个占位符来表示类型,这个类型可以是String,Integer等不确定的类型,表明可接受的类型. 泛型是Java中一个非常重要的 ...

随机推荐

  1. 本人亲测-SSM环境搭建(使用eclipse作为示例,过程挺全的,可作为参考)

    本人亲测-SSM环境搭建(使用eclipse作为示例,过程挺全的,可作为参考) 本人亲测-SSM环境搭建(使用eclipse作为示例,过程挺全的,可作为参考) 本人亲测-SSM环境搭建(使用eclip ...

  2. Jackson日期转换少一天

    1. 案例 添加一个学生,前端把生日传给后端,后端使用Datel类型接收到后,然后调用其它服务进行保存入库. 与其它服务交互时,使用的是JSON格式,出现日期少一天. @Data @AllArgsCo ...

  3. 攻防世界(XCTF)WEB(进阶区)write up(四)

    ics-07  Web_php_include  Zhuanxv Web_python_template_injection ics-07 题前半部分是php弱类型 这段说当传入的id值浮点值不能为1 ...

  4. Cocos2d-x 学习笔记(11.2) RotateBy RotateTo

    1. RotateBy RotateTo 两个旋转方法.RotateBy是在当前角度上旋转设置的角度.RotateTo是直接旋转到设置的角度,方向遵循“就近原则”.两者没有相互继承关系. 1.1 成员 ...

  5. SpringBoot2.x--入门篇--01--HelloWorld

    很多人说,学习springboot至少需要spring基础,servlet基础等等,笔者不敢苟同.凡是有一定java基础的人,都可以直接学习springboot,当学到原理和源码时,通过查缺补漏的方式 ...

  6. Unity - Raycast 射线检测

    本文简要分析了Unity中射线检测的基本原理及用法,包括: Ray 射线 RaycastHit 光线投射碰撞信息 Raycast 光线投射 SphereCast 球体投射 OverlapSphere ...

  7. boost::VS2017下编译和配置boost库

    环境: win10  vs2017  v141 1.下载  boost_1_70_0.zip. 2.以管理员方式打开 3. bootstrap.bat 4.编译64位库 b2.exe stage -- ...

  8. POJ 3020 Antenna Placement(二分图 匈牙利算法)

    题目网址:  http://poj.org/problem?id=3020 题意: 用椭圆形去覆盖给出所有环(即图上的小圆点),有两种类型的椭圆形,左右朝向和上下朝向的,一个椭圆形最多可以覆盖相邻的两 ...

  9. python方法是什么?

    python方法是什么? 方法用来描述对象所具有的行为. 在类中定义的方法可以粗略分为四大类:公有方法.私有方法.静态方法.类方法. 公有方法.私有方法一般所指属于对象的实例方法, 私有方法的名字以两 ...

  10. 设计模式(十)Strategy模式

    Strategy模式,就是用来整体地替换算法,可以轻松地以不同的算法解决同一个问题. 还是根据一个示例程序来理解这种设计模式吧.先看一下示例程序的类图. 然后看示例程序代码. package bigj ...