Java_反射机制
来源:互联网 发布:淘宝怎么设置登录验证 编辑:程序博客网 时间:2024/06/11 13:23
Java里的反射机制
Java里的一套API
- Java.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.newInstance5、如何动态调用属性:Class.forName
- Java_反射机制
- Java_反射机制
- 第十三章:Java_反射机制
- Java_反射
- JAVA_反射
- java_反射
- java_反射
- JAVA_反射
- Java_反射
- Java_反射
- java_反射
- java_什么是反射?
- java_反射日记
- Java_反射(reflect)
- Java_垃圾回收机制
- Java_反射_内省JavaBean
- Java_反射的基本应用
- Java_反射技术_简述
- Java NIO系列教程(二) Channel
- Linux下Apache Hadoop2.7.2的集群安装以及WordCount示例
- 5.Object-c/IOS 枚举类型:enum,NS_ENUM,NS_OPTIONS
- Android Low memory killer
- java集合框架概述
- Java_反射机制
- 限制EditText输入文字的数目
- Java NIO系列教程(三) Buffer
- JDK7新特性
- IdentityScope.cs
- jquery选择器 之 获取父级元素、同级元素、子元素
- 高并发大数据量(系统所考虑问题)
- matlab对图像进行直方图均衡化
- 三、go语言操作 mongodb mgo --go语言学习笔记