java反射获取方法以及调用方法

news/2024/10/30 17:27:54/

Class类中获取方法:

public Method[] getMethods();//获取包括自身和继承(实现)过来的所有的public方法——Method不支持泛型<>,即后面不接<>

public Method[] getDeclaredMethods();//获取自身所有的方法(private、public、protected,和访问权限无关),不包括继承的

在jdk1.8后可以直接获取私有属性的方法不需要设置权限 但是仅限于getDeclaredMethod方法  对于Method 的方法仍然需要设置

权限。

public Method[] getMethod(String methodName, Class<T>...parameterTypes);//表示获取指定的一个公共的方法,包括继承的

参数: methodName:表示获取的方法的名字

       parameterTypes:表示获取的方法的参数的Class类型

public Method[] getDeclaredMethod(String methodName, Class<T>...parameterTypes);//表示获取本类中的一个指定的方法(private、protected、public,与访问权限无关),不包括继承的方法

1、获取某个类中的方法

public static void main(String args[]) throws Exception {Class<?> cls = SysUserClient.class;
//        public Method[] getMethods();//获取包括自身和继承(实现)过来的所有的public方法——Method不支持泛型<>,即后面不接<>
//        public Method[] getDeclaredMethods();//获取自身所有的方法(private、public、protected,和访问权限无关),不包括继承的Method methods[] = cls.getDeclaredMethods();for (Method met : methods) {String res = "";int mod = met.getModifiers();//先输出方法名字res = res + Modifier.toString(mod) + " " + met.getReturnType().getName() + " " + met.getName() +  "(";Class<?> params[] = met.getParameterTypes();for (int x = 0; x < params.length; x ++) {//拼凑出方法要求的数据类型res = res + params[x].getName() + " "  + "args-" + x;if (x < params.length - 1) {res = res +",";}}res = res + ") ";Class<?> exp[] = met.getExceptionTypes();if (exp.length > 0) {//获取其支持处理的异常信息res = res + "throws ";}for (int x = 0 ; x < exp.length ; x ++) {res = res + exp[x].getName();if (x < exp.length - 1) {res = res +",";}}System.out.println(res);System.out.println(); //换行}}

获取结果如图

 2、java反射调用方法

//    不使用反射机制怎么调用对象?
//    public static void main(String[] args) {
//        SysUserDTO dto = new SysUserDTO();
//        dto.setUserName("吴素");
//        dto.setId(9);
//        dto.setAge("20");
//        dto.setUserEmail("nangong@163.com");
//        HopeRequest hopeRequest = new HopeRequest();
//        hopeRequest.setAppId("zkawTest");
//        hopeRequest.setPublicKey(PUBLIC_KEY_STRING);
//        hopeRequest.setType("list");
//        hopeRequest.setData(JSONObject.toJSONString(dto));
//        String pageModelBaseResponse = SysUserClient.invokeApi(hopeRequest);
//        System.out.println(pageModelBaseResponse);
//    }//通过反射机制调用对象
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {SysUserDTO dto = new SysUserDTO();dto.setUserName("吴素");dto.setId(9);dto.setAge("20");dto.setUserEmail("nangong@163.com");HopeRequest hopeRequest = new HopeRequest();hopeRequest.setAppId("zkawTest");hopeRequest.setPublicKey(PUBLIC_KEY_STRING);hopeRequest.setType("list");hopeRequest.setData(JSONObject.toJSONString(dto));Class clazz  =  SysUserClient.class;Method method =  clazz.getDeclaredMethod("invokeApi",new Class[]{HopeRequest.class});Object invoke = method.invoke(new SysUserClient(), new Object[]{hopeRequest});System.out.println(invoke);}

反射机制的作用:让代码很具有通用性,可变化的内容都是写到配置文件当中,将来修改配置文件之后,创建的对象不一样,调用的方法也不同了,但是java代码不需要做任何的改动 。

补充:

getMethod(方法名,Object... args)invoke(Object obj,Object... args)可变长参数Object... args这就是可变长参数语法是:类型...(注意:一定是3个点)1.可变长参数要求的参数个数是:0~N个2.可变长参数只能有一个,并且必须在参数列表的最后一个位置上3.可变长数组可以当做一个数组来看待

3、补充一些关于Java反射的知识

Java反射的作用:在Java代码编译时,可以通过反射访问装载到JVM中类的内部信息。

如: Clazz.getName()获取类的完整名字

                  getPackage()获取此类所属的包

                  getSuperclass() 获取父类对应的Class对象

                   getFiled(String name) 获得类的指定成员变量

                   getMethods() 获得类的public类型的方法

                   getMethod(String name, Class[] args) 获取类的指定方法


http://www.ppmy.cn/news/133197.html

相关文章

电热水器工作过程 c语言,电热水器工作原理—电热水器工作原理及使用注意事项介绍...

电热水器现在已经成为了一种最为受到消费者喜爱的热水设备&#xff0c;而在我们大家购买电热水器的时候&#xff0c;并不是很了解电热水器&#xff0c;所以今天小编就来为大家介绍一下电热水器的一些工作原理及一些使用中的注意事项&#xff0c;希望可以帮助大家多了解一下电热…

天燃气与电热水器哪个用着成本低?

对于家庭中所使用的热水器&#xff0c;最常用的就是电热水器&#xff0c;另外就是燃气热水器。我们在选择这两种不同热水器的时候&#xff0c;一般除了考虑热水器本身的价格以外&#xff0c;很多的朋友都会考虑燃气热水器和电热水器费用的问题。因为它们一个是用电&#xff0c;…

电热水器和插座之间的相亲故事

回到武汉&#xff0c;租房&#xff0c;然后发现原来的热水器不出水。让房产公司派师傅过来修理&#xff0c;终究还是放弃治疗了。不久&#xff0c;安装了一个新的电热水器。 我喜出望外&#xff0c;等了两个周&#xff0c;终于可以有热水了。结果发现&#xff0c;我现有的公牛插…

bosch热水器教程_bosch热水器使用步骤

bosch热水器使用步骤&#xff1a; 1、在使用燃气热水器之前应该仔细的阅读说明书&#xff0c;在安装燃气热水器的时候它的管道最好采用金属管&#xff0c;不宜使用橡胶管&#xff0c;防止管道出现老化。 2、平时我们应该经常检查气源和热水器整个管路系统&#xff0c;大家可以使…

导热系数仪 德国PSL 德国培赛乐 快速阻垢性能测试仪 抗车辙剂 摇摆槽 水合物摇摆槽 水合物相变的固-液-气多相流动 水合物阻聚剂分析 沥青硫化氢分析 沥青絮凝点 沥青絮凝点测定仪 油田注水阻垢剂

沥青絮凝滴定仪&#xff0c;FT5沥青絮凝滴定仪 使用自动絮凝滴定仪 FT5 测量非常深色、未稀释的原油和石油产品中沥青质的沉淀和结晶。 特点 无需稀释即可获得准确且可重复的结果压力高达 700 bar (10,000 psi)温度范围 – 25 .. 200 C (-13 .. 392 F)独立设备或完整的测量站点…

ESP8285 多个bin文件合并烧录

可通过两种方式烧录固件&#xff0c;一种是基于esp-idf开发时&#xff0c;中命令终端执行make flash命令烧录&#xff1b;二是使用ESPFlashDownloadTool工具。 bin文件说明 ESP8285/ESP8266的固件一般包含4个bin文件。 查看各bin文件的路径 以带OTA的固件为例&#xff0c;在…

【MySQL】从0到1打开数据库管理

目录 前言&#xff1a; 一.认识MySQL 二.安装MySQL数据库 三、启动和停止MySQL服务 3.1启动服务的两种方式 3.2停止服务的两种方式 四.链接客户端 4.1使用自带的命令行窗口 4.2使用系统自带的命令窗口 五.MySQL是存储数据的模型 六.SQL语言 结尾&#xff1a; 前言&a…

爆笑语录

原贴:http://user.qzone.qq.com/415113727 爆笑语录 发表时间&#xff1a;2007年6月16日 17时59分56秒 评论/阅读( 0/ 9) 1、 碗掉下来&#xff0c;天大个疤 2、一次文艺晚会&#xff0c;主持人上台报幕&#xff1a;下面请欣赏&#xff1a;新疆歌舞&#xff0c;掀起你的…