反射的概念:能够分析具体类的能力的程序称为反射

(JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。)

反射机制的作用:

    1、在程序运行中分析类的能力2、在运行中查看对象
1、反射机制==>检查类的结构:

预备知识:java.lang.reflect包中有三个类Field、Method、Constructor分别用来描述类的域(属性/字段)、方法、构造器

1、用反射分析类的能力(代码实现)

package 反射机制;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Scanner;
/*** 利用反射分析类的能力*/
public class ReflectionTest {public static void main(String[] args) {// 从命令行或参数读取用户输入String name;if(args.length>0) name=args[0];else{Scanner in=new Scanner(System.in);System.out.println("输入类名  (例如:java.util.Date):");name=in.next();}try {//获取类名所对应的Class对象Class cl=Class.forName(name);Class supercl=cl.getSuperclass();//获取类修饰符String modifiers=Modifier.toString(cl.getModifiers());if(modifiers.length()>0)System.out.print(modifiers+" ");System.out.print("calss "+name);if(supercl!=null&&supercl!=Object.class)System.out.print(" extends "+supercl.getName());System.out.print("{\n");printConstructors(cl);System.out.println();printMethods(cl);System.out.println();printFields(cl);System.out.println("}");} catch (ClassNotFoundException e) {e.printStackTrace();} }/*** 输出所有的构造方法*/public static void printConstructors(Class cl){//获取所有的构造方法对象Constructor[] constructors=cl.getDeclaredConstructors();for(Constructor c:constructors){String name=c.getName();System.out.print("  ");//返回一个整数,用不同的位描述public和static这样的修饰符使用状况int mod=c.getModifiers();//将修饰符打印出来String modifiers=Modifier.toString(mod);if(modifiers.length()>0)System.out.print(modifiers+' ');System.out.print(name+'(');//输出参数类型Class[] paramTypes=c.getParameterTypes();for(int j=0;j<paramTypes.length;j++){if(j>0)System.out.print(", ");System.out.print(paramTypes[j].getName());}System.out.println(");");}}/*** 输出类的所有方法* @param cl*/public static void printMethods(Class cl){Method[] methods=cl.getDeclaredMethods();for(Method m:methods){Class retType=m.getReturnType();String name=m.getName();System.out.print("  ");//输出声明、返回类型、方法名String modifiers=Modifier.toString(m.getModifiers());if(modifiers.length()>0)System.out.print(modifiers+' ');System.out.print(retType.getName()+" "+name+"(");//输出参数类型Class[] paramTypes=m.getParameterTypes();for(int j=0;j<paramTypes.length;j++){if(j>0)System.out.print(", ");System.out.print(paramTypes[j].getName());}System.out.println(");");}}/*** 输出类的所有域(属性)* @param cl*/public static void printFields(Class cl){Field[] fields=cl.getDeclaredFields();for(Field f:fields){//返回域所属类型的对象Class type=f.getType();String name=f.getName();System.out.print("  ");String modifiers=Modifier.toString(f.getModifiers());if(modifiers.length()>0)System.out.print(modifiers+' ');System.out.println(type.getName()+" "+name+";");}}
}

输出结果:

输入类名  (例如:java.util.Date):
java.util.Date
public calss java.util.Date{public java.util.Date(int, int, int, int, int, int);public java.util.Date(java.lang.String);public java.util.Date();public java.util.Date(long);public java.util.Date(int, int, int);public java.util.Date(int, int, int, int, int);public boolean after(java.util.Date);public boolean before(java.util.Date);public boolean equals(java.lang.Object);public java.lang.String toString();public int hashCode();public java.lang.Object clone();public int compareTo(java.util.Date);public volatile int compareTo(java.lang.Object);private void readObject(java.io.ObjectInputStream);private void writeObject(java.io.ObjectOutputStream);private final sun.util.calendar.BaseCalendar$Date normalize(sun.util.calendar.BaseCalendar$Date);private final sun.util.calendar.BaseCalendar$Date normalize();public static long parse(java.lang.String);public int getDate();public static java.util.Date from(java.time.Instant);public long getTime();private static final java.lang.StringBuilder convertToAbbr(java.lang.StringBuilder, java.lang.String);private final sun.util.calendar.BaseCalendar$Date getCalendarDate();private static final sun.util.calendar.BaseCalendar getCalendarSystem(int);private static final sun.util.calendar.BaseCalendar getCalendarSystem(sun.util.calendar.BaseCalendar$Date);private static final sun.util.calendar.BaseCalendar getCalendarSystem(long);public int getDay();public int getHours();private static final synchronized sun.util.calendar.BaseCalendar getJulianCalendar();static final long getMillisOf(java.util.Date);public int getMinutes();public int getMonth();public int getSeconds();private final long getTimeImpl();public int getTimezoneOffset();public int getYear();public void setDate(int);public void setHours(int);public void setMinutes(int);public void setMonth(int);public void setSeconds(int);public void setYear(int);public java.lang.String toGMTString();public java.time.Instant toInstant();public java.lang.String toLocaleString();public void setTime(long);public static long UTC(int, int, int, int, int, int);private static final sun.util.calendar.BaseCalendar gcal;private static sun.util.calendar.BaseCalendar jcal;private transient long fastTime;private transient sun.util.calendar.BaseCalendar$Date cdate;private static int defaultCenturyStart;private static final long serialVersionUID;private static final [Ljava.lang.String; wtb;private static final [I ttb;
}

上述代码在运行过程中分别分析了一个类的构造器、方法、域

JAVA的反射机制==用反射分析类的实现相关推荐

  1. Java 数据交换格式反射机制SpringIOC原理分析

    数据交换格式&反射机制&SpringIOC原理分析 什么是数据交换格式? 数据交换格式使用场景 JSON简单使用 什么是JSON? JSON格式的分类 常用JSON解析框架 使用fas ...

  2. Java 反射机制[Field反射]

    Java 反射机制[Field反射] 1.  反射概念及功能 反射就是把Java类中的各种成分映射成对应的Java类.比如一个Java类中用一个Class类的对象来表示. 一个类中的组成部分分为成员变 ...

  3. java虚拟机类加载机制与反射全解

    java虚拟机类加载机制与反射全解 引子: 开门见山,先来个经典面试题:(如果你已经懂了,那么你可以离开了,如果你一脸懵逼,那么请好好看本文,理解透彻很有好处!) class SingleTon {p ...

  4. Golang反射机制的实现分析——reflect.Type方法查找和调用

    在<Golang反射机制的实现分析--reflect.Type类型名称>一文中,我们分析了Golang获取类型基本信息的流程.本文将基于上述知识和经验,分析方法的查找和调用.(转载请指明出 ...

  5. Java 学习之反射机制“解刨”分解类,并获取内容!

    正常情况下,单纯的做开发是接触不到反射机制的(额,当然并不排除例外的情况了).下面我就对我学到的反射方面的知识做一个小小的总结,旨在复习和以后的查看. 原理分析: 所谓反射就是将一个类当做我们研究的对 ...

  6. 哪些类用来实现java反射机制_JAVA反射机制

    运行时类型识别(Run-time Type Identification, RTTI)主要有两种方式,一种是我们在编译时和运行时已经知道了所有的类型,另外一种是功能强大的"反射"机 ...

  7. java反射取实体字符串_JAVA反射机制 通过反射 Field类获取和修改对象类的字符串值...

    实际编程中如果我们要使用系统中未暴露的方法,我们可以通过反射来使用这些方法,但在使用过程中我们很难确定方法对用的参数类型,以下的代码可以帮你得到这些信息: package cn.sunzn.refle ...

  8. Java的反射机制 及 操作Class类

    反射 一.静态语言和动态语言 1.1 静态语言 静态语言是在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量之前必须声明数据类型,运行时结构不可变. 例如:C.C++.Java.De ...

  9. Golang反射机制的实现分析——reflect.Type类型名称

    现在越来越多的java.php或者python程序员转向了Golang.其中一个比较重要的原因是,它和C/C++一样,可以编译成机器码运行,这保证了执行的效率.在上述解释型语言中,它们都支持了&quo ...

最新文章

  1. Nginx负载均衡的详细配置及使用案例
  2. springboot 集成jpa_基于Spring Boot+JPA Restful 风格的数据
  3. 多層開發注重效率的注意點
  4. 2020 蚂蚁面试指南!
  5. C++:线程操作之CRITICAL_SECTION用法的介绍和例子理解
  6. java多张图片上传安卓,Android Rxjava+Retrofit2 多图片+文字上传
  7. [JavaScript] 判断网页能不能被IFrame 嵌入
  8. 雷军微博正式“确认”:Redmi Note 9 5G高配版处理器就是它
  9. stylus 设置全局样式_在vue-cli 3中, 给stylus、sass样式传入共享的全局变量
  10. Unity工程3D和2D开发模式切换
  11. leetcode *1818. 绝对差值和(2021.7.14)
  12. 分布式部署 Zabbix 监控平台
  13. Netty里面的Boss和Worker【Server篇】
  14. 浅谈小微企业智能化财务转型
  15. Spring Cloud概念+案例(eureka注册+拉取、ribbon负载均衡+重试)、netfix各组件介绍【上】
  16. Activiti6--入门学习--结束事件
  17. 元宇宙之NFT行业分析:中国数字藏品行业有望走向规范化、差异化
  18. js对象添加元素、集合添加对象
  19. SX1278 LoRa通讯的频率设定
  20. python+beautifulsoup/xpath实现新浪微博某互粉好友全部好友圈微博爬虫

热门文章

  1. jstack 线程状态详解
  2. 释万行上师:罕见的修行真相揭秘【全】
  3. 零阶保持器(ZOH)与一阶低通滤波器频率特性分析
  4. 涉外诉讼公证认证北京代办流程时间
  5. typeorm中文网【TS】你们要的TypeORM中文文档Ta来了
  6. 【听】你会杀死那个胖子吗?功利与道德的选择
  7. 2018年吉林大学软件学院软件工程学硕复试笔试题回忆
  8. JSP SSH机械设备台账管理系统myeclipse开发mysql数据库MVC模式java编程网页设计
  9. 【无标题扫地机SRRC认证】
  10. 老毛桃pe装机工具一键还原系统