反射(reflection)学习整理

上传人:cl****1 文档编号:460301713 上传时间:2022-10-31 格式:DOCX 页数:25 大小:59.30KB
返回 下载 相关 举报
反射(reflection)学习整理_第1页
第1页 / 共25页
反射(reflection)学习整理_第2页
第2页 / 共25页
反射(reflection)学习整理_第3页
第3页 / 共25页
反射(reflection)学习整理_第4页
第4页 / 共25页
反射(reflection)学习整理_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《反射(reflection)学习整理》由会员分享,可在线阅读,更多相关《反射(reflection)学习整理(25页珍藏版)》请在金锄头文库上搜索。

1、反射学习整理【摘要】 本文主要通过自己对反射机制的总结编写的文档,主要目的就是为了自己以后能可以参 考温习也可以方便刚刚入门的同仁们学习指导,通过 doc 的编写相信可以在帮助别人的同时 提高自己。反射机制; Reflection API;如何使用反射机制;反射机制的应用举例;第一节反射机制什么是反射机制,说的通俗一些就是在java运行期间动态加载一些不确定的类对象, 那么我们如何使用一个类的呢?当然大多数情况下我们是使用一个确定的类,然后通过在内 存中的加载再使用之。其实在一个project中会有很多类,虚拟机并不是在每一次运行时都将所有的类都进行 加载然后解析的,是在我们使用的过程中才会被

2、加载,这个大家可以看一下ClassLoader(在 后期中我也会编写ClassLoader相关的文章总结)反射机制提供的功能:加载运行时才能确定的数据类型;绢解析类的结构,获取其内部的信息;能够操作的类型或者实例;1. 访问属性;2. 调用方法;3. 创建新的对象;以上的功能我会在接下来的文字中都进行阐述,然后每一个功能点都会通过代码的形式 进行逐一的说明举例;11动态加载类Java虚拟机在运行是能加载的类型有如下几种:类接口;数组;枚举; 注解(Annotation,可以参见我的另一篇文档,java Annotation学习文档);基本数据类型;在类加载的时候,JVM会自动加载上述类型对应的

3、Class对象。package com.wangwenjun.demo;import java.util.ArrayList;public class ReflectionDemo1 private final static String LIST_STRING=java.util.ArrayList; / 动态加载java.util.ArrayList的类路径SuppressWarnings(unchecked)public static void main(String args) try Class clazz=Class.forName(LIST_STRING);/通过反射获取运行时的

4、ClassArrayList list=(ArrayList) clazz.newIns tance(); /通过 newIns tance 方法获取 O bjec t list.add(hello);System.out.println(list.size()+:+list.get(0); catch (ClassNotFoundException e) e.printStackTrace(); catch (InstantiationException e) / TODO Auto-generated catch blocke.printStackTrace(); catch (Illeg

5、alAccessException e) / TODO Auto-generated catch blocke.printStackTrace();执行结果为:1:hello通过上面的代码我们可以总结出来使用Reflection大致需要如下的几步: 获取目标对象的Class对象;调用Class对象内省方法获取目标对类成员信息;访问目标类的成员属性;1.2 解析类的结构通过第一步的操作,我们获取了目标对象的class之后就可以解析出来class对应的内部 结构;别不多说直接上代码,来看看如何解析出来目标对象;我们定义一个Teacher类package com.wangwenjun.demo;pu

6、blic class Teacher private String username;private int age;汪文君QQ: 532500648,属于个人劳动成果,如需转载请标明出处,如果本文中有什么偏差的地方也 希望大家和我交流让我及时纠正。private static int total;public Teacher()super();total+;public Teacher(String username, int age) super();this.username = username;this.age = age; total+;public String getUsern

7、ame() return username;public void setUsername(String username) this.username = username;public int getAge() return age;public void setAge(int age) this.age = age;public static int getTotal() return total;public static void setTotal(int total) Teacher. total = total;Overridepublic String toString()re

8、turn UserName:+this.username+,age:+this.age; 假如说上述的Teacher类是在我们运行时才知道的一个类,也就是说是我们运行时才能确 定的一个类,那么我们就可以通过反射的形式将它解析出来,包括它的属性,方法,以及构造函 数等等。好了,下面有一个专门的类针对Teacher进行解析,通过观察打印的语句我们就可以 看出来效果package com.wangwenjun.demo;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflec

9、t.Method;import java.lang.reflect.Modifier;public class ReflectionTeacher private final static StringTEACHER_CLASS=com.wangwenjun.demo.Teacher;SuppressWarnings(unchecked)public static void main(String args) try Class clazz = Class.forName(TEACHER_CLASS);Field fields = clazz.ge tDeclaredFields();/获取该

10、类中的属性成员Met hod met hods = clazz.ge tDeclaredMe thods();/获取该类中的成员方法Cons truc tor cons truc tors = clazz.ge tCons truc tors();/获取 该类的所有构造方法System. out .println(*打印成员属性*);for(Field field:fields)System. out .println(属性: + field);System. out .println(名称: + field.getName();System. out .println(修饰符:+Modifi

11、er.toString(field.getModifiers();System. out .println(数据类型: + field.getType();System.out.println(=);System. out .println(*打印成员方法*); for(Method method:methods)System. out .println(方法:+method.toString();System. out .println(方法名称:+method.getName();System.out. println(符:+Modifier.toString(method.getModi

12、fiers();System. out .println(方法参数列表);Class mClass=method.getParameterTypes();System. out .print(mClass. length !=0?有参数:无参数:); for(Class c:mClass)System. out .print(c.getName()+类型t);System. out. println(型:+me thod.getReturnType().getName();System.out.println(=);System. out .println(*打印构造方法 *);for(Con

13、struetor construetor:construetors)System. out .println(构造方法:+eonstruetor.toString();System. out .println(构造方法名:+eonstruetor.getName(); System. out .println(构造方法修饰符:+Modifier.toString(eonstruetor.getModifiers();Class mClass=eonstruetor.getParameterTypes();Sys tem. out .pri nt( mClass. leng th !=0?有参数

14、:无参数:); for(Class e:mClass)System. out .print(e.getName()+类型t);System.out.println(n=); catch (ClassNotFoundExeeption e) e.printStaekTraee();日志输出:*打印成员属性*属性:private java.lang.String eom.wangwenjun.demo.Teaeher.username 名称:username修饰符:private数据类型:elass java.lang.String属性:priva te int eom.wangwenjun.demo.Teaeher.age名称:age修饰符:private 数据类型:int 属性:private static int com.wangwenjun.demo.Teacher. total 名称:t

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号