java中Class.getMethods()和Class.getDeclaredMethods()方法的区别
作者:freeTimeWY 发布时间:2021-05-28 23:05:46
在java中,可以根据Class类的对象,知道某个类(接口)的一些属性(成员 ,方法,注释,注解)等。由于最近的工作中用到了这些,其中需要在代码中格局反射知道某些类的方法,查看文档的时候,看到了getMethods()和getDeclaredMethods()的差异。虽然两者都能实现目的,但个人觉得还是有必要区分下。
JDK API(1.6)文档中是这样翻译两个方法的:
getMethods():
返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。数组类返回从 Object 类继承的所有(公共)member 方法。返回数组中的元素没有排序,也没有任何特定的顺序。如果此 Class 对象表示没有公共成员方法的类或接口,或者表示一个基本类型或 void,则此方法返回长度为 0 的数组。类初始化方法 <clinit> 不包含在返回的数组中。如果类声明了带有相同参数类型的多个公共成员方法,则它们都会包含在返回的数组中。
getDeclaredMethods():
返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。返回数组中的元素没有排序,也没有任何特定的顺序。如果该类或接口不声明任何方法,或者此 Class 对象表示一个基本类型、一个数组类或 void,则此方法返回一个长度为 0 的数组。类初始化方法 <clinit> 不包含在返回数组中。如果该类声明带有相同参数类型的多个公共成员方法,则它们都包含在返回的数组中。
大致上来看,两个方法的区别主要在于:getMethods()返回的是该类以及超类的公共方法。getDeclaredMethods()返回该类本身自己声明的包括公共、保护、默认(包)访问和私有方法,但并不包括超类中的方法。比如如下列子:
public class TestObject
{
private void method1()
{
}
public void method2()
{
}
void method3()
{
}
protected void method4()
{
}
}
public class TestClass
{
public static void main(String[] args)
{
Method[] methods = TestObject.class.getMethods();
System.out.println("getMethods():");
for (Method method : methods)
{
System.out.println(method.getName());
}
Method[] methods2 = TestObject.class.getDeclaredMethods();
System.out.println("===========================");
System.out.println("getDeclaredMethods():");
for (Method method : methods2)
{
System.out.println(method.getName());
}
}
}
运行TestClass结果:
getMethods():
method2
wait
wait
wait
equals
toString
hashCode
getClass
notify
notifyAll
===========================
getDeclaredMethods():
method1
method2
method3
method4
很明显getMethods()就返回一个自己声明的method2()方法,其余的方法全部是来自Object类。getDeclaredMethods()
返回了自生声明的四个方法。两个方法的主要区别就在这里吧。
另外,返回Method数组为0 的情况也是JDK按照文档上介绍的一样。比如”空”接口,基本类型:
public interface TestInterface
{
}
//两种方法返回的都是空
以及基本类型:两种方法返回的也都是空
Method[] methods = int.class.getMethods();
Method[] methods2 = int.class.getDeclaredMethods();
总结:其实Class中有很多相似的方法比如:getAnnotations()
和getDeclaredAnnotations(),
以及getFields()和getDeclaredFields()等等,不同之处和上面基本一样
总结
以上所述是小编给大家介绍的java中Class.getMethods()和Class.getDeclaredMethods()方法的区别网站的支持!
来源:https://www.cnblogs.com/wy697495/archive/2018/09/12/9631909.html


猜你喜欢
- 介绍:淡入淡出动画(也称为“叠化”)逐渐淡出一个 View 或 ViewGroup,同时淡入另一个。此动画适用于您希望在应用中切换内容或视图
- using System;using System.Collections.Generic;using System.ComponentMo
- 安卓自定义分段式的进度条,供大家参考,具体内容如下前一段时间公司新项目接到一个新需求,其中界面需要用到一个分段式的进度条,找了半天没有发现类
- 自定义log4j日志文件命名规则项目中的日志需要采用一致的命名规范和文件规范,命名规则为:项目模块标识_index_日期时间_日志级别.lo
- 目录1.下面有关JSP内置对象的描述,说法错误的是?2.Java语言与其它语言相比,独有的特点是( )3.下面哪个选项正确创建socket连
- 自动去除图像扫描黑边/// <summary>  
- 前言1.因为涉及到对象锁,Wait、Notify一定要在synchronized里面进行使用。2.Wait必须暂定当前正在执行的线程,并释放
- 申请百度地图密钥以及查看百度API网址:http://lbsyun.baidu.com/apiconsole/key#/home网址:htt
- 本文实例为大家分享了TabLayout结合ViewPager实现页面切换效果的具体代码,供大家参考,具体内容如下先看看效果,如图:1.因为T
- 程序中的错误分为编译时的错误和运行时的错误。编译时的错误主要是语法错误,比如:句尾没有加分号,括号不匹配,关键字错误等,这类错误比较容易修改
- 1.application.yml中添加两个datasourceserver: port: 8080spring: application:
- 用Canvas画贝塞尔曲线,要画贝塞尔曲线首先了解贝塞尔曲线:由于用计算机画图大部分时间是操作鼠标来掌握线条的路径,与手绘的感觉和效果有很大
- 最近对接接口的时候,需要根据对方的请求数据类型来进行传值,常用的就是application/x-www-form-urlencoded,aj
- 引言layout: postcategories: Javatitle: 一文带你了解 Spring 的@Enablexxx 注解tagli
- 首先定义布局文件:<?xml version="1.0" encoding="utf-8"?&
- 引言native image是GraalVM中提供的一个命令,可以把字节码文件或Jar包编译成为一个二进制可执行文件,同时它自己也是用Jav
- 前言多数据源的事务处理是个老生常谈的话题,跨两个数据源的事务管理也算是分布式事务的范畴,在同一个JVM里处理多数据源的事务,比较经典的处理方
- 今天再学习一些C#的基础知识,如对 Int Array进行排序:你可以在控制台应用程序中,创建一个类别,它属性和2个构造函数:Source
- 我们学习网络编程最熟悉的莫过于Http,好,我们就从Http入手,首先我们肯定要了解一下h
- 一、定时器是什么定时器类似于我们生活中的闹钟,可以设定一个时间来提醒我们。而定时器是指定一个时间去执行一个任务,让程序去代替人工准时操作。标