@

Method 类描述的是类对象的方法信息。 其中包含了被反射方法的信息, 访问信息。在运行时, 我们可以通过该类进行方法的调用。

1 获取 Method

1.1 方法

因为 Java 中的 java.lang.reflect 包下所有类的构造函数都不为 public, 同时类都是 final 类型的, 因此, 不能直接通过外部 new 来获取该方法。

获取所有的 public 方法,包括其父类, 接口的

public Method[] getMethods();

获取指定参数的 public 方法, 包括其父类, 接口的

public Method getMethod(String name, Class<?>... parameterTypes);

获取声明(public, private, protected, friendly)的所有普通方法

public Method[] getDeclaredMethods();

获取声明(public, private, protected, friendly)的指定参数的普通方法

public Method getDeclaredMethod(String name, Class<?>... parameterTypes);

1.2 实例

该实例称为实例1。

定义父类

public class ParentClass {
private String privateMethod(){
return "ParentClass::privateMethod";
}
String defaultMethod(){
return "ParentClass::defaultMethod";
}
protected String protectedMethod(){
return "ParentClass::protectedMethod";
}
public String publicMethod(){
return "ParentClass::public";
}
}

定义子类

public class ChildClass extends ParentClass {
private String childPrivateMethod(){
return "ChildClass::childPrivateMethod";
}
String childDefaultMethod(){
return "ChildClass::childDefaultMethod";
}
protected String childProtectedMethod(){
return "ChildClass::childProtectedMethod";
}
public String childPublicMethod(){
return "ChildClass::childPublicMethod";
}

测试类

public class MethodTest {
public static void main(String[] args) {
Class<ChildClass> childClass = ChildClass.class;
Method[] methods = childClass.getMethods();
System.out.println("============getMethods================");
for (Method method:methods) {
System.out.println(method.getName());
} Method[] dMethods = childClass.getDeclaredMethods();
System.out.println("============getMethods================");
for (Method method:dMethods) {
System.out.println(method.getName());
}
}
}

输出

2 Method 的方法

Method 是存储方法相关的信息, 因此, 其方法及属性都跟这些相关。

2.1 Java 方法基础知识

下面是一个方法的属性:

  1. 修饰符:修饰符,这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。
  2. 返回值 :方法可能会返回值。returnValueType 是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值。在这种情况下,returnValueType 是关键字void。
  3. 方法名:是方法的实际名称。方法名和参数表共同构成方法签名。
  4. 参数:参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
  5. 异常:方法中抛出的异常类型。
  6. 注解:方法上的注解。

2.2 修饰符相关方法

在 Java 中, 修饰符以数字的形式存在, 通过 int 存储了32位的数字, 就可以存储多个数值, 此种存储方式在Modifier 中会进行讲解。

2.2.1 获取修饰符

    public int getModifiers() {
return modifiers;
}

同样以之前 [实例1] 的代码进行测试, 重写写一个测试方法

    public static void main(String[] args) {
Class<ChildClass> childClass = ChildClass.class;
Method[] methods = childClass.getMethods();
System.out.println("============getMethods================");
for (Method method:methods) {
System.out.println(method.getName()+"::"+Modifier.toString(method.getModifiers()));
}
}

结果

2.2.2 判断是否为 default 方法

public boolean isDefault() {
// Default methods are public non-abstract instance methods
// declared in an interface.
return ((getModifiers() & (Modifier.ABSTRACT | Modifier.PUBLIC | Modifier.STATIC)) ==
Modifier.PUBLIC) && getDeclaringClass().isInterface();
}

这是 Java 8 中引入的概念:默认方法是在接口中声明的, public, 非 abstract 的实体方法(实体方法即不是 static 方法)。

在此处不展开。

2.2.3 判断是否为 bridge 方法

    public boolean isBridge() {
return (getModifiers() & Modifier.BRIDGE) != 0;
}

判断是否为桥接方法。

2.2.4 判断是否为 synthetic 方法

    public boolean isSynthetic() {
return super.isSynthetic();
}

判断是否为 synthetic 方法。

2.3 获取返回值类型

    public Class<?> getReturnType() {
return returnType;
}

2.4 获取方法名

    public String getName() {
return name;
}

2.5 获取返回值

2.5.1 方法

获取返回值的类型有两种:

获取到返回值的 Class类型的对象

    public Class<?> getReturnType() {
return returnType;
}

获取到返回值的 Type类型的对象

    public Type getGenericReturnType() {
if (getGenericSignature() != null) {
return getGenericInfo().getReturnType();
} else { return getReturnType();}
}

2.5.2 测试

定义类

public class Animal {
private Map<String,Animal> friends = new HashMap<>(); public void addFriend(String name, Animal animal){
friends.put(name,animal);
} public Animal callFriend(String name){
return friends.get(name);
} public<T extends Animal> T callFriend(String name, T unusedTypeObj){
return (T)friends.get(name);
} public static void main(String[] args) {
Class<Animal> clazz = Animal.class;
Method[] methods = clazz.getDeclaredMethods();
for (Method method:methods) {
System.out.println(method.getName()+"::"+method.getReturnType()+"::"+method.getGenericReturnType());
}
}
}

输出

2.6 参数

获取所有的参数, 返回值是 Class 数组

 public Class<?>[] getParameterTypes()

获取所有参数, 返回值是 Type 数组

public Type[] getGenericParameterTypes()

获取参数的所有注解

public Annotation[][] getParameterAnnotations()

2.7 异常

2.7.1 方法

获取所有的异常, 返回值是 Class 数组

public Class<?>[] getExceptionTypes()

获取所有的异常, 返回值是 Type 数组

public Type[] getGenericExceptionTypes()

获取注解异常

public AnnotatedType[] getAnnotatedExceptionTypes()

2.7.2 测试

public class ExceptionExample {
public static void main(String[] args) throws Exception {
Method m = ExceptionExample.class.getMethod("method");
System.out.println(m.getGenericExceptionTypes()[0]);
System.out.println(m.getExceptionTypes()[0]);
}
public static <T extends Throwable> void method() throws T {}
}

输出

2.8 注解

获取声明的所有注解

public Annotation[] getDeclaredAnnotations()

2.9 调用相关

2.9.1 访问权限控制

抑制Java的权限控制检查:在针对非public时方法时, 可以考虑这么用

public void setAccessible(boolean flag)

2.9.2 方法调用

方法调用

 public Object invoke(Object obj, Object... args)

2.9.3 测试

使用示例1中的代码

    public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {
Class<ChildClass> childClass = ChildClass.class;
Method[] methods = childClass.getDeclaredMethods();
System.out.println("============getMethods================");
ChildClass child = new ChildClass();
for (Method method:methods) {
method.setAccessible(true);
System.out.println(method.invoke(child));
}

如果注释权限控制, 输出如下



取消注释之后

反射那点基础-Method的更多相关文章

  1. 提高java反射速度的方法method.setAccessible(true)

    转载:http://huoyanyanyi10.iteye.com/blog/1317614 提高java反射速度的方法method.setAccessible(true) package com.c ...

  2. Java---类反射(1)---类反射入门和基础

    什么是类反射 ☆什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方 ...

  3. Java进阶之reflection(反射机制)——反射概念与基础

    反射机制是Java动态性之一,而说到动态性首先得了解动态语言.那么何为动态语言? 一.动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化.比如常见 ...

  4. java笔记--反射机制之基础总结与详解

    一.反射之实例化Class类的5种方式: java的数据类型可以分为两类,即引用类型和原始类型(即基本数据类型). 对于每种类型的对象,java虚拟机会实例化不可变的java.lang.Class对象 ...

  5. 反射获取成员方法(Method)

    1.1.1 反射公开的非静态的成员方法 Method getDeclaredMethod(String name,Class ... parameterTypes)获取某个方法. 说明: 1)在Cla ...

  6. PYDay14:反射、面向对象基础-封装、集成、多态

    1.反射 通过字符串的形式,导入模块再通过字符串的形式,去模块中寻找指定的函数并执行eg:__import__(模块) 更加字符串的形式去对象(某个模块)中操作其成员 常用方法: getattr() ...

  7. Java反射概念与基础

    反射机制是Java动态性之一,而说到动态性首先得了解动态语言.那么何为动态语言? 一.动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化.比如常见 ...

  8. Python全栈--9 __import__ 反射和面向对象基础 self 封装 继承(多继承的顺序) 多态

    一.反射 python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删 ...

  9. golang基础--method方法

    Go没有类似python语言中类class的概念,但依旧有method 类型方法定义格式如下 func (a mytype) method_name(x type)(y type){ return y ...

随机推荐

  1. (转)Android 之生成图形验证码

    import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; impor ...

  2. 使用Visual Studio Team Services敏捷规划和项目组合管理(二)——VSTS中的工作项

    使用Visual Studio Team Services敏捷规划和项目组合管理(二)--VSTS中的工作项 1.通过project/team下拉菜单选择MyHealthClinic\Web,导航到W ...

  3. mssql sqlserver 关键字 GROUPING用法简介及说明

    转自: http://www.maomao365.com/?p=6208  摘要: GROUPING 用于区分列是否由 ROLLUP.CUBE 或 GROUPING SETS 聚合而产生的行 如果是原 ...

  4. python 函数参数为*和**的作用与区别

    def function(*args):print(args) 中*的作用:表示此时参数为一个元祖. def function(**args):print(args)中**的作用:表示此时参数为一个字 ...

  5. WinServerDFS

    DFS提供共享路径统一命名,且文件相互备份,具有高可用性. 1.在相应的服务器上安装服务. --命名空间,复制以及管理控制台的安装 install-windowsfeature fs-dfs-name ...

  6. c/c++ 标准库 set 自定义关键字类型与比较函数

    标准库 set 自定义关键字类型与比较函数 问题:哪些类型可以作为标准库set的关键字类型呢??? 答案: 1,任意类型,但是需要额外提供能够比较这种类型的比较函数. 2,这种类型实现了 < 操 ...

  7. IPerf——网络测试工具介绍与源码解析(2)

    对于IPerf源码解析,我是基于2.0.5版本在Windows下执行的情况进行分析的,提倡开始先通过对源码的简单修改使其能够在本地编译器运行起来,这样可以打印输出一些中间信息,对于理解源码的逻辑,程序 ...

  8. [Hive_9] Hive 的排序

    0. 说明 全排序(order by) | 部分排序(sort by) | hash 分区(distribute by)  | cluster by 1. 前期准备 1.1 建表 create tab ...

  9. Java的基础知识三

    一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...

  10. Linux for python教程02

    目录 1. Linux用户及权限管理 1.1. who 1.2. 查看当前用户: whoami 1.3. 添加用户账号: useradd 1.4 切换用户 su 2.用户组 3. 修改文件权限: ch ...