通过反射访问方法(学习笔记)
2017-03-29 21:10
537 查看
这一节的讲解我们也分为三个小部分,和上一节讲的访问成员变量的形式差不多,分别是
通过getMethods()等方法获得类中的方法,然后以数组形式返回
通过getName(),isVarAges()等方法获得该方法的具体信息
通过invoke(Object obj,Object…Args)利用指定参数Args执行制定对象obj中的该方法,返回值为Object类型
首先我们先来看第一部分,通过getMethods()等方法获得类中的方法
接下来的二三部分我们还是看代码
上述代码我们创建了几个方法,其中他们的返回类型,传入参数的类型,权限修饰符各不相同
输出结果为
名称为:staticM
是否含有可变数量的参数:false
入口参数类型依次为:
异常依次为:
执行staticM方法
名称为:intM
是否含有可变数量的参数:false
入口参数类型依次为:
int
异常依次为:
执行public intM方法
返回值为:168
名称为:protectedM
是否含有可变数量的参数:false
入口参数类型依次为:
class java.lang.String
int
异常依次为:
class java.lang.NumberFormatException
执行protectedM方法
返回值为:12
名称为:privateM
是否含有可变数量的参数:true
入口参数类型依次为:
class [Ljava.lang.String;
异常依次为:
输出异常解决方法
执行privateM方法
返回值为:MYX
上述代码中为我们演示了获取方法的具体信息,和使用invoke(Object obj,Object…Args)执行制定方法,并且返回值
通过getMethods()等方法获得类中的方法,然后以数组形式返回
通过getName(),isVarAges()等方法获得该方法的具体信息
通过invoke(Object obj,Object…Args)利用指定参数Args执行制定对象obj中的该方法,返回值为Object类型
首先我们先来看第一部分,通过getMethods()等方法获得类中的方法
getMethods() 此方法获得所有权限为public的方法,按指定顺序以数组形式返回 getMethod(String name) 获得权限为public的指定方法 getDelcareMethods() 获得所有方法,按指定顺序以数组形式返回 getDelcareMethod(String name) 获得指定方法
接下来的二三部分我们还是看代码
public class Example_03 { static void staticM(){ System.out.println("执行staticM方法"); } public int intM(int i){ System.out.println("执行public intM方法"); return i; } protected int protectedM(String s,int i) throws NumberFormatException{ System.out.println("执行protectedM方法"); return Integer.valueOf(s)+i; } private String privateM(String...strings){ System.out.println("执行privateM方法"); StringBuffer stringBuffer=new StringBuffer(); for (int i = 0; i < strings.length; i++) { stringBuffer.append(strings[i]); } return stringBuffer.toString(); } }
上述代码我们创建了几个方法,其中他们的返回类型,传入参数的类型,权限修饰符各不相同
package annotation; import java.lang.reflect.Method; public class Main_03 { public static void main(String[] args) { Example_03 example=new Example_03();//创建一个Example_03的对象,example Class exampleC=example.getClass();//利用getClass()方法返回一个Class对象 Method[] declareMethod=exampleC.getDeclaredMethods(); //通过Class获得example中所有的方法,以数组形式返回 for (int i = 0; i < declareMethod.length; i++) {//遍历example对象中的方法 Method method=declareMethod[i]; System.out.println("名称为:"+method.getName());//通过getName()获得方法名称 System.out.println("是否含有可变数量的参数:"+method.isVarArgs()); //通过isVarArgs()查看是否带有可变数量的参数,如果有,返回true Class [] paraTypes=method.getParameterTypes(); //通过getParameterTypes()获得此方法所有传入参数的类型,返回一个Class类对象数组 System.out.println("入口参数类型依次为:"); for (int j = 0; j < paraTypes.length; j++) { System.out.println(""+paraTypes[j]);//输出入口参数类型 } System.out.println("异常依次为:"); Class[] expection=method.getExceptionTypes(); //通过getExceptionTypes()获得此方法所有可能发生的异常,返回一个Class类对象数组 for (int j = 0; j < expection.length; j++) { System.out.println(""+expection[j]);//输出异常 } boolean isturn=true; while(isturn){ try { isturn=false; if ("staticM".equals(method.getName())) {//判断方法的名称 method.invoke(example);//执行方法 }else if("intM".equals(method.getName())){//判断方法的名称 System.out.println("返回值为:"+method.invoke(example, 168));//使用指定参数执行方法 }else if("protectedM".equals(method.getName())){//判断方法的名称 System.out.println("返回值为:"+method.invoke(example, "7",5));//使用指定参数执行方法 }else if ("privateM".equals(method.getName())) {//判断方法的名称 Object[] strings=new Object[]{new String[]{"M","Y","X"}};//使用指定参数执行方法 System.out.println("返回值为:"+method.invoke(example, strings)); } } catch (Exception e) { // TODO: handle exception System.out.println("输出异常解决方法"); method.setAccessible(true);//定义允许访问私有方法 isturn=true; } } System.out.println(); } } }
输出结果为
名称为:staticM
是否含有可变数量的参数:false
入口参数类型依次为:
异常依次为:
执行staticM方法
名称为:intM
是否含有可变数量的参数:false
入口参数类型依次为:
int
异常依次为:
执行public intM方法
返回值为:168
名称为:protectedM
是否含有可变数量的参数:false
入口参数类型依次为:
class java.lang.String
int
异常依次为:
class java.lang.NumberFormatException
执行protectedM方法
返回值为:12
名称为:privateM
是否含有可变数量的参数:true
入口参数类型依次为:
class [Ljava.lang.String;
异常依次为:
输出异常解决方法
执行privateM方法
返回值为:MYX
上述代码中为我们演示了获取方法的具体信息,和使用invoke(Object obj,Object…Args)执行制定方法,并且返回值
相关文章推荐
- 通过反射访问成员变量(学习笔记)
- Android(java)学习笔记107-1:通过反射获得带参构造方法并且使用
- Android(java)学习笔记109:通过反射获取成员变量和成员方法并且使用
- python学习笔记6.9-通过字符串访问类的方法
- Mcad学习笔记之通过反射调用類的方法,屬性,字段,索引器(2種方法)
- Android(java)学习笔记108:通过反射获取私有构造方法并且使用
- Android(java)学习笔记107-0:通过反射获得构造方法并且使用
- [学习笔记]通过open函数改变标准输出的方法
- Android开发学习笔记之通过反射技术修改listview的快速滑块图像
- 通过反射访问父类的私有方法
- spring学习笔记九 通过工厂方法配置bean
- sqlserver -- 学习笔记(二)“SQL Server 阻止了对组件 'xp_cmdshell' 的 过程'sys.xp_cmdshell' 的访问”解决方法
- 笔记:javascript通过反射和遍历,访问对象的所有属性,及 按引用/按值传递
- NDK开发学习笔记(2):JNI访问Java中的方法
- python进阶学习笔记(四)——python中访问限制、创建类属性、定义实例方法、定义类方法、类的继承
- Hibernate学习笔记---通过load和get方法来查询对象(只能根据主键来查询)
- 访问form对象的关键属性和方法【学习笔记】
- 8 面向对象(制作帮助文档,通过JDK提供的API学习了Math类,代码块,继承(继承子父成员访问特点,super关键字,方法重写))
- c++11学习笔记3——通过更通用的方法实现新特性
- Docker 学习笔记1—创建一个docker nginx镜像并通过浏览器访问