package com.test5;

import java.lang.reflect.Field;
import java.lang.reflect.Method; /**
* Java泛型和反射机制(泛型的好处 代码安全简单,自动装箱拆箱,提高代码的重用率)
*/
public class test5 {
public static void main(String[] args) {
Employer employer = new Employer(1000, "张三", 25);
Ref<Employer> ref1 = new Ref<Employer>(employer);
System.out.println("---------------------打印类信息-----------------------");
ref1.printClassMethodMessage();
System.out.println("---------------------打印类成员变量信息-----------------------");
ref1.printFieldMessage(); /* 打印显示
---------------------打印类信息-----------------------
类的名称是:com.test5.Employer
java.lang.String toString()
java.lang.String getName()
void setName(java.lang.String,)
int getEid()
int getAge()
void setAge(int,)
void setEid(int,)
void wait(long,)
void wait(long,long,int,)
void wait()
boolean equals(java.lang.Object,)
int hashCode()
java.lang.Class getClass()
void notify()
void notifyAll()
---------------------打印类成员变量信息-----------------------
int eid
java.lang.String name
int age
*/
}
} /**
* 泛型类
* @param <T>
*/
class Ref<T> {
private T o; //构造函数
public Ref(T o) {
this.o = o;
} /**
* 打印类的信息,包括类的成员函数,成员变量
*/
public void printClassMethodMessage() {
//要获取类的信息,首先要获取类的类类型
Class c = o.getClass();//传递的是哪个子类的对象,c 就是子类的类类型
//获取类的名称
System.out.println("类的名称是:" + c.getName()); /**
* Method类,方法对象
* 一个成员方法就是一个Method对象
* getMethods()方法获取的是所有的public的函数,包括父类继承而来的
* getDeclaredMethods()方法获取的是所有该类自己声明的方法,不问访问权限
*/
Method[] methods = c.getMethods();//c.getDeclaredMethods()
for (int i = 0; i < methods.length; i++) {
//得到方法的返回值类型的类类型
Class returnType = methods[i].getReturnType();
System.out.print(returnType.getName() + " ");
//打印方法名字
System.out.print(methods[i].getName() + "(");
Class<?>[] parameterTypes = methods[i].getParameterTypes();
String para = "";
for (Class class1 : parameterTypes) {
para += class1.getName() + ",";
System.out.print(para);
}
System.out.println(")");
}
} /**
* 获取成员变量的信息
*/
public void printFieldMessage() {
Class c = o.getClass();
/**
* 成员变量也是对象
* java.lang.reflect.Field
* getFields()方法获取的是所有的public 的成员变量的信息
* getDeclaredFields 获取的是该类自己声明的成员变量的信息
*/
// Field[] fs = c.getFields();
Field[] fs = c.getDeclaredFields();
for (Field field : fs) {
//得到成员变量的类型的类类型
Class fieldType = field.getType();
String typeName = fieldType.getName();
//得到成员变量的名称
String fieldName = field.getName();
System.out.println(typeName + " " + fieldName);
}
}
} class Employer {
public Employer(int eid, String name, int age) {
this.eid = eid;
this.name = name;
this.age = age;
} private int eid;
private String name;
private int age; public int getEid() {
return eid;
} public void setEid(int eid) {
this.eid = eid;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "Employer{" +
"eid=" + eid +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}

  

Java基础系列 - 泛型和反射机制的更多相关文章

  1. 夯实Java基础系列13:深入理解Java中的泛型

    目录 泛型概述 一个栗子 特性 泛型的使用方式 泛型类 泛型接口 泛型通配符 泛型方法 泛型方法的基本用法 类中的泛型方法 泛型方法与可变参数 静态方法与泛型 泛型方法总结 泛型上下边界 泛型常见面试 ...

  2. Java开发培训基础知识解析之反射机制

    Java是老牌编程语言,是当前应用最广泛的编程语言之一.想要学习Java你就一定要掌握Java基础知识,而反射对于初学Java的人来说绝对是非常重要的知识点.什么是反射?如何理解反射机制?如何使用反射 ...

  3. 夯实Java基础系列11:深入理解Java中的回调机制

    目录 模块间的调用 多线程中的"回调" Java回调机制实战 实例一 : 同步调用 实例二:由浅入深 实例三:Tom做题 参考文章 微信公众号 Java技术江湖 个人公众号:黄小斜 ...

  4. 夯实Java基础系列9:深入理解Class类和Object类

    目录 Java中Class类及用法 Class类原理 如何获得一个Class类对象 使用Class类的对象来生成目标类的实例 Object类 类构造器public Object(); register ...

  5. 夯实Java基础系列15:Java注解简介和最佳实践

    Java注解简介 注解如同标签 Java 注解概述 什么是注解? 注解的用处 注解的原理 元注解 JDK里的注解 注解处理器实战 不同类型的注解 类注解 方法注解 参数注解 变量注解 Java注解相关 ...

  6. Java工程师学习指南第1部分:夯实Java基础系列

    点击关注上方"Java技术江湖",设为"置顶或星标",第一时间送达技术干货. 本文整理了微信公众号[Java技术江湖]发表和转载过的Java优质文章,想看到更多 ...

  7. 黑马程序员:Java基础总结----泛型(高级)

    黑马程序员:Java基础总结 泛型(高级)   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 泛型(高级) 泛型是提供给javac编译器使用的,可以限定集合中的输入类型 ...

  8. Java基础系列-ArrayList

    原创文章,转载请标注出处:<Java基础系列-ArrayList> 一.概述 ArrayList底层使用的是数组.是List的可变数组实现,这里的可变是针对List而言,而不是底层数组. ...

  9. Java基础系列--HashMap(JDK1.8)

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/10022092.html Java基础系列-HashMap 1.8 概述 HashMap是 ...

随机推荐

  1. J.U.C之AQS:阻塞和唤醒线程

    此篇博客所有源码均来自JDK 1.8 在线程获取同步状态时如果获取失败,则加入CLH同步队列,通过通过自旋的方式不断获取同步状态,但是在自旋的过程中则需要判断当前线程是否需要阻塞,其主要方法在acqu ...

  2. ASCII&UNICODE编码演化

    ASCII 上个世纪60年代,美国制定了基于拉丁字母的一套电脑编码系统,取名为ASCII.它主要用于显示现代英语和其他西欧语言,是现今最通用的单字节编码系统. ASCII码使用指定的7位或8位二进制数 ...

  3. [#Linux] CentOS 7 美化调优

    优化美化系统,是为了让新系统能更顺眼顺手,符合自己过去在windows下的使用习惯,从而实现平稳过渡. 正如开篇时谈到的,现在的桌面版linux已相当友好(特别是Ubuntu),基本不需要做什么额外设 ...

  4. Django组件之forms

    forms:校验字段功能 针对一个实例:注册用户讲解. 模型:models.py class UserInfo(models.Model): name=models.CharField(max_len ...

  5. 现在记录几款好用的vscode的插件

    vscode 插件 Rainbow Brackets编码过程中,尤其在我们使用js进行函数式编程时,代码里会有很多的花括号,想要保证它们对称十分困难,所以就出现了上面小粉同学的尴尬局面,相信很多人都遇 ...

  6. 美化WebApi,使其统一返回Json格式

    博客部分代码来自其他博主,暂时找不到你的博文连接,如果您觉得我的代码中引入了您的代码或者文章,可在下方把您的博客文章写在下面,谢谢!!! WebApi有两种返回数据格式,一种是XML,一种是Json, ...

  7. Linux CPU问题排查

    某个进程的内存占用情况 查找进程pid——>进入该进程的目录/proc/{pid}/.有三个文件记录了进程内存 root@ROUTER:~# ps | grep zebra 1507 root ...

  8. POI中的CellType类型以及值的对应关系

    POI 中的CellType类型以及值的对应关系 CellType 类型 值 CELL_TYPE_NUMERIC 数值型 0 CELL_TYPE_STRING 字符串型 1 CELL_TYPE_FOR ...

  9. linux网络编程之system v信号量(一)

    今天起,学习信号量相关的知识,下面开始: 关于信号量,在前面已经介绍过了,这里回顾一下: 通过上面的描述,很容易就能想到信号量的一上数据结构: 下面再来回顾一下P.V原语: 所谓的原语就是指这段代码是 ...

  10. linux下环境管理anaconda3

    我之前在centos之安装单独python3.6,大家都知道centos自带python2.7,通过输入python,和python3来控制想要使用python2,或者python3,如今想要要在li ...