JAVA反射使用父类的非public方法(getMethods()和getDeclaredMethods()区别)

本文主要是介绍JAVA反射使用父类的非public方法(getMethods()和getDeclaredMethods()区别),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

getMethods()和getDeclaredMethods()区别

虽然是老生常谈了,但是还是要先说一下两者的区别。
getMethods():能够获取类的所有public方法,包括自身定义的以及从父类继承的。
getDeclaredMethods():能够获取类本身的所有方法,包括private方法,实现的接口方法,但是不能获取从父类继承的非public方法。
因此getDeclaredMethods()使得我们能够在其他类操作private方法,代码更加的灵活,不过尽量少用就是了。

操作父类的非public方法

有点标题党= =,因为自己看到这两个方法定义的时候发现两个方法的盲点:继承自父类的protected方法和default方法都无法被反射获取,可是子类也确实能够使用它们。防止大家困惑这个问题以及自己做笔记,才写了这篇文章。
经过查询资料发现:这两个方法确实不能直接操作父类的protected和defaulted方法

//父类
public class ParentDemo {public String parentPbulic(){return null;}protected String parentProtect(){return null;}String parentDefault(){return null;}private String parentPrivate(){return null;}
}
//子类
public class Demo extends ParentDemo {public String publicDemo(){return null;}protected String protectedDemo(){return null;}String defaultDemo(){return null;}private String privateDemo(){return null;}
}
//验证
public class TestDemo {public static void main(String[] args){Class clazz = Demo.class;System.out.println("=========children getDeclaredMethods============");Method[] methods = clazz.getDeclaredMethods();for(Method method : methods){System.out.println(method.getName());}System.out.println("=========children getMethods============");Method[] methods2 = clazz.getMethods();for(Method method : methods2){System.out.println(method.getName());}Class Pclazz = clazz.getSuperclass();System.out.println("===========parent getDeclaredMethods======");Method[] pmethods = Pclazz.getDeclaredMethods();for(Method method : pmethods){System.out.println(method.getName());}}
}
//结果
=========children getDeclaredMethods============
protectedDemo
defaultDemo
privateDemo
publicDemo
=========children getMethods============
publicDemo
parentPublic
wait
wait
wait
equals
toString
hashCode
getClass
notify
notifyAll
===========parent getDeclaredMethods======
parentPrivate
parentDefault
parentPublic
parentProtect

可以看出,要想操作父类的default和protected方法,只能通过getSuperClass先获取到父类的class对象,然后再进行操作。
我的理解是,因为default和protected方法虽然子类也可以操作,但方法实际归属还是属于父类,所以无法直接用子类获得,而public方法是完全没限制,所以就无所谓了,当然这只是为了自己方便理解哈哈。
我们这里讲的虽然只是方法,但是变量其实也一样,getFields()和getDeclaredFields()就不在赘述了。
这个理解只是一家之言,如果有不同意见欢迎指出。

这篇关于JAVA反射使用父类的非public方法(getMethods()和getDeclaredMethods()区别)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1144691

相关文章

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

Before和BeforeClass的区别及说明

《Before和BeforeClass的区别及说明》:本文主要介绍Before和BeforeClass的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Before和BeforeClass的区别一个简单的例子当运行这个测试类时总结Before和Befor

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

LiteFlow轻量级工作流引擎使用示例详解

《LiteFlow轻量级工作流引擎使用示例详解》:本文主要介绍LiteFlow是一个灵活、简洁且轻量的工作流引擎,适合用于中小型项目和微服务架构中的流程编排,本文给大家介绍LiteFlow轻量级工... 目录1. LiteFlow 主要特点2. 工作流定义方式3. LiteFlow 流程示例4. LiteF

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.