java.lang.reflect.Method

java.lang.reflect.Method

一、Method类是什么
  Method是一个类,位于java.lang.reflect包下。
  在Java反射中 Method类描述的是 类的方法信息,通俗来讲 有一个类如下:

package com.testReflect;

public class MethodDemo {
    private int num = 2;
    private String str = "xixi";
    
    public int addResult(int addNum){
        return num + addNum;
    }
    
    @Override
    public String toString() {
        return "MethodDemo [num=" + num + ", str=" + str + "]";
    }
}

在Java反射中MethodDemo类中的方法addResult(int addNum)、toString()都是Method类的实例,这个Method类的实例描述了方法的全部信息。(包括:方法修饰符、方法名称、参数列表 等等)

二、如何获取Method类对象
  一共有4种方法,全部都在Class类中:
    - getMethods(): 获得类的public类型的方法
    - getMethod(String name, Class[] params): 获得类的特定方法,name参数指定方法的名字,params参数指定方法的参数类型
    - getDeclaredMethods(): 获取类中所有的方法(public、protected、default、private)
    - getDeclaredMethod(String name, Class[] params): 获得类的特定方法,name参数指定方法的名字,params参数指定方法的参数类型

三、Method类常用方法
  对于类中的方法,我们常用的操作:调用方法。

package com.testReflect;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class MethodTest {
    public static void main(String[] args) throws Exception {
        //使用反射第一步:获取操作类MethodDemoFieldDemo所对应的Class对象
        Class<?> cls = Class.forName("com.testReflect.MethodDemo");
        //使用MethodDemo类的class对象生成 实例
        Object obj = cls.newInstance();
        
        //获取public int addResult(int addNum)方法
        Method addMethod = cls.getMethod("addResult", new Class[]{int.class});
        System.out.println("修饰符: " + Modifier.toString(addMethod.getModifiers()));
        System.out.println("返回值: " + addMethod.getReturnType());
        System.out.println("方法名称: " + addMethod.getName());
        System.out.println("参数列表: " + addMethod.getParameterTypes());
        int result = (int)addMethod.invoke(obj, 2);
        System.out.println("调用addResult后的运行结果:" + result);
        
        System.out.println("--------------------------------");
        
        //获取public String toString() 方法
        Method toStringMethod = cls.getMethod("toString", new Class[]{});
        System.out.println("修饰符: " + Modifier.toString(toStringMethod.getModifiers()));
        System.out.println("返回值: " + toStringMethod.getReturnType());
        System.out.println("方法名称: " + toStringMethod.getName());
        System.out.println("参数列表: " + toStringMethod.getParameterTypes());
        String msg = (String)toStringMethod.invoke(obj);
        System.out.println("调用toString后的运行结果:" + msg);
    }
}

Method类的invoke(Object obj,Object args[])方法接收的参数必须为对象,如果参数为基本类型数据,必须转换为相应的包装类型的对象。invoke()方法的返回值总是对象,如果实际被调用的方法的返回类型是基本类型数据,那么invoke()方法会把它转换为相应的包装类型的对象,再将其返回.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在您使用 JDK 8 编译程序,然后在 JDK 17 上运行时出现的错误信息是: ``` accessible:module java.base does not "opens java.lang" to unnamed module @93c2679 at java.base/java.Lang.reflect.Accessibleobject.checkCanSetAccessible(Accessibleobject.java:354) at java.base/java.lang.reflect.Accessibleobject.checkCanSetAccessible(Accessibleobject.java:297) at java.base/java.Lang.reflect.Method.checkCanSetAccessible(Method.java:199) at java.base/java.lang.reflect.Method.setAccessible(Method.java:193) at com.sun.xml.bind.v2.runtime.reflect.opt.Injector$1.run(Injector.java:150) at com.sun.xml.bind.v2.runtime.reflect.opt.Injector$1.run(Injector.java:147) at java.base/java.security.AccessController.doPrivileged(AccessController.java:318) at com.sun.xml.bind.v2.runtime.reflect.opt.Injector.<clinit>(Injector.java:146) ``` 这个错误表明在您的程序中,存在一个访问权限问题。具体来说,它指出 java.base 模块没有将 java.lang 模块开放给未命名模块,导致访问权限被拒绝。 这个问题可能是由于 JDK 17 引入了模块化系统,而 JDK 8 不支持模块化系统导致的。要解决这个问题,您可以尝试以下几个步骤: 1. 尝试将代码升级为使用模块化系统。在 JDK 9 及更高版本中,引入了模块化系统,您可以通过创建模块描述文件(module-info.java)来声明模块依赖和开放的包。请确保您的代码和依赖项都兼容模块化系统,并正确声明了访问权限。 2. 如果您无法将代码升级为使用模块化系统,您可以尝试在 JDK 17 上使用 `--illegal-access=permit` 参数来放宽对非法访问的检查。请注意,这个参数只是一个临时解决方案,并不推荐在生产环境中使用。 3. 如果您的代码依赖于特定的库或框架,可能需要升级这些库或框架以与 JDK 17 兼容。请查阅相关文档或联系库/框架的开发者以获取更多支持。 需要注意的是,尽管您的程序在 Windows 上运行没有问题,但在 Linux 上出现了错误。这可能是由于平台差异导致的,因此建议您在运行时检查和解决与平台相关的问题。 如果以上步骤都没有解决问题,建议提供更多的上下文信息,例如您的代码片段、使用的库和依赖项,以及在 Linux 上运行程序时的详细步骤,以便更好地理解和解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值