Java反射
2016-05-03 22:01
531 查看
反射基础
java程序中的许多对象在运行时都会出现这两种类型:编译时类型和
运行时类型,比如:Person p = new Student();
1. 获取Class对象
使用Class类的forName(String clazzName)静态类方法。传入的字符串参数值是某个类的全限定类名调用某个类的class属性。比如,Person.class
调用某个对象的getClass()方法,返回对象所属类对应的Class对象
一旦获得了某个类对应的Class对象之后,就可以通过调用Class对象的方法来获得该对象和该类的真实消息
2. 从Class中获取信息
1)构造函数
1. Constructor<T> getConstructor(Class<?>... parameterTypes) 返回此Class对象对应类的、带指定形参列表的public构造器 2. Constructor<?>[] getConstructors() 返回此Class对象对应类的所有public构造器 3. Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 返回此Class对象对应类的、带指定形参列表的构造器,与构造器的权限无关 4. Constructor<?>[] getDeclaredConstructors() 返回此Class对象对应类的所有构造器,与构造器的权限无关
2)方法
1. Method[] getMethods() 返回此Class对象对应类的所有public方法 2. Method getMethod(String name, Class<?>... parameterTypes) 返回此Class对象对应类的、带指定形参列表的public方法 3. Method getDeclaredMethod(String name, Class<?>... parameterTypes) 返回此Class对象对应类的、带指定形参的方法, 与方法的权限无关 4. Method[] getDeclaredMethods() 返回此Class对象对应类的全部方法,与方法的权限无关
3)成员变量
1. Field[] getDeclaredFields() 返回此Class对象对应类的所有成员变量,与权限无关 2. Field getDeclaredField(String name) 返回此Class对象对应类的、指定名称的成员变量,与权限无关 3. Field[] getFields() 返回此Class对象对应类的所有public成员变量 4. Field getField(String name) 返回此Class对象对应类的、指定名称的public成员变量
其他请参考API
使用反射生成对象
使用Class对象的newInstance()方法来创建Class对象对应类的实例,这种方式要求该Class对象的对应类有默认构造函数。先使用Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建该Class对象对应类的实例。
使用反射调用方法
当获得某个类对应的Class对象时,就可以通过该Class对象的getMethods()或者getMethod()方法来获取Method数组或Method对象,每个Method对象对应一个方法,可以通过Object invoke(Object obj, Obejct... args)来调用它对应的方法
注意
私有方法,需要通过setAccessible(boolean flag)来控制权限
使用反射访问成员变量
使用Class对象的getFields()或getFiled()方法可以获取该类的成员变量,然后通过Field的提供方法getXxx(Object obj)和
setXxx(Object obj, Xxx val)来获取或修改成员变量的值
当访问私有成员变量时,需要设置setAccessbile
相关文章推荐
- Spring RPC 入门学习(3)-获取Student对象
- JedisConnectionException: java.net.ConnectException: Connection refused: connect
- 毕设—spring 和 hibernate在整合声明式事务的时候会报错
- Java核心技术(三) —— 对象与类(3)
- java笔记--理解java类加载器以及ClassLoader类
- 【java】Commons.Configuration读取配置文件(xml/property)
- java为什么要使用接口回调
- MyEclipse10安装PyDev插件
- java基础算法-快速排序
- Struts 2中访问Servlet API的几种方法小结
- Hashtable源码粗略解析
- JAVA SE 8 学习笔记(一)lambda表达式
- SpringMVC源代码学习(一)从HTttpServletBean到DispatcherServlet
- Java基础之基本运算
- eclipse 创建maven web项目
- 分析PNG图片格式——数据块
- java内存模型
- 深入浅出java 函数参数传递原理
- spring事物传播特性
- 奇数-函数实现