反射机制
来源:互联网 发布:win10安装不了软件 编辑:程序博客网 时间:2024/06/06 04:00
java反射机制主要提供了以下功能:
在运行时判断任意一个对象所属的类。
在运行时构造任意一个类的对象。
在运行时判断任意一个类所具有的成员变量和方法。
在运行时调用任意一个对象的方法。
这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息。
在JDK中,主要由以下类来实现Java反射机制,其中Class类位于java.lang包中,其他类都位于java.lang.reflect包中:
--Class类:代表一个类。
--Field类:代表类的成员变量(成员变量也称为类的属性)。
--Method类:代表类的方法。
--Constructor类:代表类的构造方法。
--Array类:提供了动态创建数组,以及访问数组的元素的静态方法。
Class类是Reflection APIs中的核心类,它有以下方法:
--getName():获得类的完整名字,即全路径名。
--getFields():获得类的public类型的属性。
--getDeclaredFields():获得类的所有属性。
--getMethods():获得类的public类型的方法。
--getDeclaredMethods():获得类的所有方法。
反射机制第一步:获得操作类的Class对象
一个类不管有多少个对象,这些对象都只对应同一个Class对象。
首先获得要操作类的Class对象clazz,获得某个类或某个对象对应的Class对象常用的方法有3种:
1)使用Class类的静态方法forName,根据类的全路径名得到该类的Class对象:
Class clazz = Class.forName("java.lang.String");
2)使用类的.class语法获得类的Class对象:
Class clazz = 类名.class;
再获得自己的一个实例:
类名 实例名 = (类名)clazz.newInstance();
该方法返回的是Object类型,可以进行强制类型转换。
3)使用对象的getClass()方法获得类的Class对象:
Class clazz = 类的一个对象.getClass();
反射机制第二步:根据Class对象获得目标方法对应的Method对象
获得类的Class对象后,就可以获得这个类中的方法所对应的Method对象了。根据类的Class对象获得类中的方法对应的Method对象也有多种:
如获得类中所有的方法对应的Method对象:
Method[] methods = clazz.getDeclaredMethods();
如获得类中已知方法名的public类型的方法对应的Method对象:
Method method = clazz.getMethod(String name, Class<?>... parameterTypes);
该方法接收两个参数:
第一个参数是已知的方法名。如:"add"
第二个参数是与该方法所接收参数类型对应的Class类型的可变参数,可以直接写成数组,也可以离散的传。
如:new Class[]{int.class,int.class},也可以直接写int.class,int.class
如果目标方法是构造方法,根据Class对象获得目标方法对应的Constructor对象,与获得Method对象类似。
反射机制第三步:根据Method对象对应目标方法
获得类的方法对应的Method对象后,就可以通过Method类的invoke方法调用Method对象所对应的目标方法:
如:
Object result = method.invoke(Object obj, Object... args);
该方法接收两个参数:
第一个参数:调用目标方法的对象,如果目标方法是静态的,该参数可以为null。
第二个参数:目标方法所接收的参数,是可变参数,可以写数组,也可以离散的传。
如:new Object[]{1,2},也可以直接写1,2
返回的是Object对象,也可以进行强制类型转换,转换成目标方法所返回的类型。
如果目标方法是其他类中的private类型的,可以在调用invoke方法之前,压制Java的访问控制检查:
method.setAccessible(true);
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 反射机制
- 视频编解码学习之二:编解码框架
- Linux内存管理基本概念(转载自董的博客)
- [ACM] hdu 5001 Walk (概率DP)
- U盘安装Ubuntu 14.04 LTS正式版
- 申请堆空间时出现的错误
- 反射机制
- 《数据结构》信管1133班和1134班同学链接
- uva 10069 Distinct Subsequences 【dp+大数】
- VMWare虚拟机下CentOS 配置网络实现远程连接,提供Web访问
- SQL——select语句的三种基本用法:连接,嵌套,exists
- 【网络流基础】hdu 1532 Drainage Ditches
- wpa_supplicant, wpa_cli用法
- Sublime Text 2搭建Go开发环境(Windows)
- js中询问是否要删除