RefFieldMethodDetails——查看类的域和方法

RefFieldMethodDetails,通过反射机制查看类的域和方法(包括编译器添加的“桥方法”)

public class RefFieldMethodDetails {/*** 打印出指定类的* 1、声明的所有构造方法(包括私有)* 2、声明的所有方法(包括私有)* 3、声明的所有域(包括私有)*/public static <T> void details(Class<T> clazz){details(clazz.getName());}/*** 打印出指定类的* 1、所有公共构造方法(包括超类)* 2、所有公共方法(包括超类)* 3、所有公共域(包括超类)*/public static <T> void details2(Class<T> clazz){details2(clazz.getName());}/*** 打印出指定类的* 1、声明的所有构造方法(包括私有)* 2、声明的所有方法(包括私有)* 3、声明的所有域(包括私有)*/public static void details(String name){try {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("class " + name);if(supercl !=null && supercl!=Object.class){System.out.print(" extends " + supercl.getName());}System.out.print("\n{\n");printConstructors(cl);System.out.println();printMethods(cl);System.out.println();printFields(cl);System.out.println("}");} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*** 打印出指定类的* 1、所有公共构造方法(包括超类)* 2、所有公共方法(包括超类)* 3、所有公共域(包括超类)*/public static void details2(String name){try {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("class " + name);if(supercl !=null && supercl!=Object.class){System.out.print(" extends " + supercl.getName());}System.out.print("\n{\n");printConstructors2(cl);System.out.println();printMethods2(cl);System.out.println();printFields2(cl);System.out.println("}");} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//返回本类声明的所有域(包括私有)private static void printFields(Class cl) {Field[] fields = cl.getDeclaredFields();for(Field field : fields){String modifier = Modifier.toString(field.getModifiers());Class type = field.getType();String name = field.getName();System.out.print("  ");System.out.print(modifier +" ");System.out.print(type + " ");System.out.println(name + ";");}}//返回本类的所有公共域(包括超类)private static void printFields2(Class cl) {Field[] fields = cl.getFields();for(Field field : fields){String modifier = Modifier.toString(field.getModifiers());Class type = field.getType();String name = field.getName();System.out.print("  ");System.out.print(modifier +" ");System.out.print(type + " ");System.out.println(name + ";");}}//返回本类声明的所有方法(包括私有)private static void printMethods(Class cl) {Method[] methods = cl.getDeclaredMethods();for(Method method : methods){String modifier = Modifier.toString(method.getModifiers());Class returnType = method.getReturnType();String name = method.getName();Class[] params = method.getParameterTypes();System.out.print("  ");if(modifier.length()>0){System.out.print(modifier + " ");}System.out.print(returnType.getSimpleName() +" ");System.out.print(name+"( ");for(int i=0;i<params.length;i++){System.out.print(params[i].getName());if(i!=params.length-1){System.out.print(", ");}}System.out.println(" );");}}//返回本类的所有公共方法(包括超类)private static void printMethods2(Class cl) {Method[] methods = cl.getMethods();for(Method method : methods){String modifier = Modifier.toString(method.getModifiers());Class returnType = method.getReturnType();String name = method.getName();Class[] params = method.getParameterTypes();System.out.print("  ");if(modifier.length()>0){System.out.print(modifier + " ");}System.out.print(returnType.getSimpleName() +" ");System.out.print(name+"( ");for(int i=0;i<params.length;i++){System.out.print(params[i].getName());if(i!=params.length-1){System.out.print(", ");}}System.out.println(" );");}}//返回本类声明的所有构造方法(包括私有)private static void printConstructors(Class cl) {Constructor[] cs = cl.getDeclaredConstructors();for(Constructor c : cs){String modifier = Modifier.toString(c.getModifiers());String name = c.getName();Class[] params = c.getParameterTypes();System.out.print("  ");if(modifier.length()>0){System.out.print(modifier + " ");}System.out.print(name);System.out.print("( ");for(int i=0 ;i<params.length ;i++){System.out.print(params[i].getName());if(i!=params.length-1){System.out.print(", ");}}System.out.println(" );");}}//返回本类的所有公共构造方法(包括超类)private static void printConstructors2(Class cl) {Constructor[] cs = cl.getConstructors();for(Constructor c : cs){String modifier = Modifier.toString(c.getModifiers());String name = c.getName();Class[] params = c.getParameterTypes();System.out.print("  ");if(modifier.length()>0){System.out.print(modifier + " ");}System.out.print(name);System.out.print("( ");for(int i=0 ;i<params.length ;i++){System.out.print(params[i].getName());if(i!=params.length-1){System.out.print(", ");}}System.out.println(" );");}}
}

对程序员来说,方法的签名只包括:

1、方法的名称;2、参数的类型;3、参数的顺序;

但是对JVM而言,方法的签名还包括:4、返回的类型!


演示“完全” Override,即上述4 条件都满足:

class SuperClass{private final String name;public SuperClass(String name) {super();this.name = name;}public String getName() {return "SuperClass";}}public class OverrideTest extends SuperClass{private final Date date;public OverrideTest(String name, Date date) {super(name);this.date = date;}public Date getDate() {return date;}//覆盖父类的方法,重点是这个@Overridepublic String getName() {return "OverrideTest";}
}
通过 RefFieldMethodDetails,来查看OverrideTest 类的域和方法:

	@Testpublic void testGetName() {RefFieldMethodDetails.details(OverrideTest.class);RefFieldMethodDetails.details2(OverrideTest.class);}

这和我们理解的“覆盖”相吻合!即,始终只有一个方法签名的方法。

下面来看看,“不完全”覆盖,即参数类型是继承关系(泛型的特殊处理,一般情况是重载)返回类型不同时的情况:

class Pair<T> {private T first;private T second;public Pair() {first = null;second = null;}public Pair(T first, T second) {this.first = first;this.second = second;}public T getFirst() {return first;}public T getSecond() {return second;}public void setFirst(T newValue) {first = newValue;}public void setSecond(T newValue) {second = newValue;}
}public class DateInterval extends Pair<Date>{//参数类型——有继承关系@Overridepublic void setSecond( Date second ){if( second.compareTo( getFirst()) >= 0 ){super.setSecond( second );}}//返回类型不同@Overridepublic Date getSecond(){return (Date)super.getSecond();}
}

通过 RefFieldMethodDetails,来查看 DateInterval 类的域和方法:

	@Testpublic void testOverride() {//打印DateInterval 的所有域和方法(包括private 不包括父类的)RefFieldMethodDetails.details( DateInterval.class );//打印DateInterval 的所有公共域和方法(包括父类的)RefFieldMethodDetails.details2( DateInterval.class );}

“桥方法”的任务就是调用子类相应的“不完全”覆盖的方法。

常用的“桥方法”实现有,clone 方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/498116.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

it 部门的建议_应对IT项目阻力的8个建议

点击上方“蓝色字体”&#xff0c;选择 “设为星标”关键讯息&#xff0c;D1时间送达&#xff01;大多数IT主管表示&#xff0c;有关抵触进行坦率的对话有助于产生新信息&#xff0c;从而最终推动项目向前发展。而且&#xff0c;在某些情况下&#xff0c;阻力是由于对需要进行路…

科学家首次在野外直接观察到雀类新物种的快速形成

来源&#xff1a;与峰同行博客 概要&#xff1a;新物种是怎么形成的&#xff1f;这是生物学上最根本的问题之一。大致听说过进化论的人可能都知道&#xff0c;地球上我们现在看到的各种各样的生物都是由最初的单细胞经过亿万年的进化而来的。 科学家首次在野外直接观察到雀类新…

查看某个分区之前所有的数据_腾讯大数据面试真题汇总

腾讯面试题学长11&#xff09;笔试部分&#xff08;1&#xff09;有一表名t_sh_mtt_netdisk_log&#xff0c;从表名可以看出该表是什么业务的&#xff0c;是什么周期粒度的表。&#xff08;2&#xff09;怎么查看表结构&#xff0c;表创建语句&#xff1f;怎么查看表有哪些分区…

全球16家超级独角兽公司,为什么中国能占7家,印度只有1家?未来哪些行业最可能诞生独角兽?

来源&#xff1a; 财看见-腾讯财经&#xff08;ID&#xff1a;qqckj2017&#xff09; 概要&#xff1a;对于创业公司来说&#xff0c;成为“独角兽”甚至是“超级独角兽”&#xff0c;就意味离成功只有几步之遥。 对于创业公司来说&#xff0c;成为“独角兽”甚至是“超级独角兽…

数据可视化--pyecharts绘图

pyecharts 是一个用于生成 Echarts 图表的类库。 Echarts 是百度开源的一个数据可视化 JS 库。主要用于数据可视化。 要使用pyecharts绘制地图&#xff0c;首先需要安装一下几个地图模块&#xff1a; 1、安装地图数据包&#xff0c;用于显示地图 pip install echarts-countri…

echart x轴标签偏移_1文搞懂真正的五轴加工中心,到底说的5轴是哪几个轴

随着国内数控技术的日渐成熟&#xff0c;近年来五轴联动数控加工中心在各领域得到了越来越广泛的应用。在实际应用中&#xff0c;每当人们碰见异形复杂零件高效、高质量加工难题时&#xff0c;五轴联动技术无疑是解决这类问题的重要手段。越来越多的厂家倾向于寻找五轴设备来满…

中国在国际上首次提出全液态量子器件与计算技术概念

来源&#xff1a;人民日报 概要&#xff1a;液态金属可以用来制造计算机核心电子元件&#xff0c;进而引发计算机的革命&#xff1f; 液态金属可以用来制造计算机核心电子元件&#xff0c;进而引发计算机的革命&#xff1f;不久前&#xff0c;我国一个研究小组发表了一项成果&…

如何使用frame框架,将左边视为导航栏,右边作为链接界面

在浏览网页时&#xff0c;我们经常会看到一个导航条&#xff0c;当点击导航条上的项目时&#xff0c;相应网页会在显示区域变换显示。那么如何将一个界面中&#xff0c;左边设置为导航栏&#xff0c;点击项目链接&#xff0c;则右边显示相应的内容呢&#xff1f;使用frameset框…

面对大规模AI集成,企业为何迟迟犹豫?

来源&#xff1a;亿欧 概要&#xff1a;首先&#xff0c;需要全面了解您的业务目标、技术需求以及AI对客户和员工的影响。需要解决的问题是&#xff0c;大多数员工面临着接受人工智能程度方面的挑战与担忧。 人工智能是实现流程自动化、降低运营成本和进创新的重要手段。尽管AI…

PostgreSQL+安装及常见问题

postgresql-8.1-int.msi postgresql-8.1.msi &#xff08;点这个安装&#xff09; 前面一直用默认 1、到如下画面时注意&#xff1a; 重复账户时&#xff0c;报如下错误&#xff1a; 2、勾选所有连接都能使用该PostgreSQL 数据库&#xff0c;而不是仅仅支持 Localhost 3、…

js 操作vuex数据_vue中使用vuex(超详细)

vuex是使用vue中必不可少的一部分,基于父子、兄弟组件,我们传值可能会很方便,但是如果是没有关联的组件之间要使用同一组数据,就显得很无能为力,那么vuex就很好的解决了我们这种问题,它相当于一个公共仓库,保存着所有组件都能共用的数据。 那么,我们一起来看看vue项目怎…

用脑科学支持人工智能

来源&#xff1a;中国科学报 概要&#xff1a;脑科学研究者正在揭示预测性运动控制神经机制&#xff0c;以脑科学基础研究支持人工智能发展并促进两大领域的深度融合。 最近&#xff0c;在国家自然科学基金&#xff08;项目号&#xff1a;31671075&#xff09;的支持下&#x…

mysql数据库进行更新、插入显示中文乱码问题

很多种情况下&#xff0c;从数据库中查询出来的内容中文显示正确&#xff0c;但是如果向数据库中插入或更新表时&#xff0c;会出现中文乱码问题&#xff0c;但英文显示正确&#xff0c;以下三种方式可以解决中文乱码问题。 1.数据库连接的配置文件中添加characterEncodingutf…

1进程 ppid_杀死僵尸进程,你需要这些神奇的Linux命令行

Linux高手&#xff0c;其实都是玩儿命令行很熟练的人。命令行的学习捷径Linux命令有许多强大的功能&#xff1a;从简单的磁盘操作、文件存取&#xff0c;到进行复杂的多媒体图像和流媒体文件的制作&#xff0c;都离不开命令行。在Linux的学习中&#xff0c;新手都会遇到这么一个…

PostgreSQL 常见操作

1、在命令行登录指定数据库 2、创建表 CREATE TABLE weather (city varchar(80),temp_lo int, -- low temperaturetemp_hi int, -- high temperatureprcp real, -- precipitationdate date ); …

MultipartFile文件上传

一、配置文件&#xff1a; SpringMVC 用的是 的MultipartFile来进行文件上传 所以我们首先要配置MultipartResolver:用于处理表单中的file。在springmvc.xml中进行配置&#xff0c;目录结构如下&#xff1a; <!-- 配置MultipartResolver 用于文件上传 使用spring的CommosMul…

一个简单的 iBatis 实现——完整示例

表和数据&#xff1a; CREATE TABLE weather (city varchar(80),temp_lo int, -- low temperaturetemp_hi int, -- high temperatureprcp real, -- average temperaturedate date );insert int…

测绘技术设计规定最新版_公示 | 29家单位申报甲级测绘资质审查意见

关于北京同创天成工程勘测有限公司等29家单位申报甲级测绘资质审查意见的公示  根据《中华人民共和国测绘法》和《测绘资质管理规定》《测绘资质分级标准》(国测管发〔2014〕31号)&#xff0c;我部对北京同创天成工程勘测有限公司、北京麦格天宝科技股份有限公司、中友四达(北…

智能驾驶时代已经到来

来源&#xff1a;中国科学报 概要&#xff1a;智能化、电动化、轻量化&#xff0c;无疑是被业界公认的汽车的三大发展方向。其中&#xff0c;汽车的智能化&#xff0c;或者说智能驾驶最为引人关注。 智能化、电动化、轻量化&#xff0c;无疑是被业界公认的汽车的三大发展方向。…