Java_反射机制
2016-04-05 13:29
501 查看
Java里的反射机制
Java里的一套APIJava.lang.reflect包
反射API是Java的 动态 执行机制
可以在运行期间动态加载类
可以在运行期间动态创建对象
可以再运行期间动态访问属性和方法
静态执行
当代码编译完,就能确定的调用关系,在运行期间按照编译结果排序。Foo f = new Foo(); f.test();
动态执行
与静态相反,在运行期间才能确定的调用执行关系,称为动态。反射API就是用于动态执行的API。案例:执行某个类中全部的以test为开头的无参数方法。
如上案例只能使用反射API实现:
1、根据指定的类名加载类;
2、动态创建对象;
3、动态查找类中以test为开头的方法;
4、动态执行test为开开头的方法。
反射API
可以在运行期间动态加载类可以在运行期间动态创建对象
可以再运行期间动态访问属性和方法
Class
Class对象代表类的信息、基本类型信息,Java中任何类型加载内存中都是Class的对象。提供了,动态加载类信息的方法:Class.forName(类名)class Foo{ int a = 5; } String className = "day01.Foo"; Class cls = Class.forName(className);
Java里的工作方式:
技巧:Class对象是使用反射API的入口对象!
利用Class对象可以获取类的所有声明信息
cls.getDeclaredFields() 获取全部的属性声明信息cls.getDeclaredMethods() 获取全部的方法信息
Class提供了:动态调用无参数构造器创建对象的方法
方法:cls.newInstance()功能:运行期间动态创建对象,前提:这个类必须有无参构造器(或默认构造器),否则出现异常!
案例:
//动态加载类 Scanner in = new Scanner(System.in); String className =in.nextLine(); Class cls = Class.forName(className); //调用cls.newInstance() 动态创建对象 Object obj = cls.newInstance(); System.out.println(obj); //测试案例:day01.Foo java.util.ArrayList //java.io.BufferedInputStream //异常
如上代码的意义
new ArrayList() 是静态创建对象,事先知道类名
cls.newInstance()是动态创建对象,事先不执行类名,类名是运行期间动态输入的 !
如果在开发中,遇到了不知道类名时候创建对象时候,使用反射动态创建对象。
Class提供了动态查找方法的方法
cls.getDeclaredMethods() 查找全部方法cls.getDeclaredMethod(方法签名) 查找一个方法
方法签名:方法名+参数类型列表
//查找全部的方法 Method[] methods = cls.getDeclaredMethods(); for(Method m:methods){ //编译擦除 String name = m.getName(); Class[] paramTypes = m.getParamtersTypes(); if(name.startsWith("test")&& paramType.length==0){ //m就是以test开头的方法 //m 代表找到的方法信息 //m.invoke(对象,传递参数)调用执行m对应的方法 //对象:this,就是当前对象,实际执行的是:对象.m(传递参数) m.invoke(obj,new Object[0]); } } //遍历全部的方法,找出以test为开头的无参方法
目的查找以test为开头的方法
Method 提供了动态执行方法的功能
总结 反射
1、何时使用反射:动态加载类型,动态创建对象,动态调用方法,动态访问属性。是Java提供的动态执行API。2、反射的功能:动态执行
3、反射是Java提供的API,拿来使用即可。
4、反射使用技巧:
Class 对象作为入口:
Class.forName,根据类名加载类
obj.getClass() ,根据对象找到类
类名.class 已知类名找到Class对象
Class cls = String.class;
创建对象、找到相关类信息(属性、方法)
动态调用属性、方法
重点方法
- Class.forName
- Class.newInstance
- Method.invoke()
面试:
1、框架底层用什么实现:反射 2、反射的功能是什么:动态加载类,动态创建对象,动态调用方法和属性 3、如何动态调用方法:Method.invoke() 4、如何动态创建对象:Class.newInstance 5、如何动态调用属性:Class.forName
相关文章推荐
- Java NIO系列教程(二) Channel
- Java NIO系列教程(一) Java NIO 概述
- Java NIO 教程
- javap(反编译)
- Java 8新特性-3 Lambda 表达式
- JAVA基础--容器 Set, List, Map
- MAC JDK版本切换
- 同步,异步,阻塞,非阻塞的Java例子
- JavaWeb——文件上传和下载
- springMVC 项目根路径访问页面配置
- Java 8新特性-1 函数式接口
- Java笔记 - 线程基础知识
- # 20145334赵文豪 《Java程序设计》第5周学习总结
- 根据依赖来编译java文件,生成class
- java 抽象类与接口的区别
- java 删除linkedlist链表中重复元素
- SpringMVC - Controller 返回值的可选类型
- 由浅入深学Java Socket
- 解决eclipse闪退
- Java eclipse生成doc文档