文档章节

java反射机制

凯哥学堂
 凯哥学堂
发布于 2016/11/17 14:07
字数 584
阅读 29
收藏 0

一、为什么使用反射

  为了写通用性的代码,如框架等。编译时期不知道传入的对象的类型,无法调用方法和属性,所以框架为了实现通用性,将Object为参数,只在运行的时候通过该类的Class对象获得类的信息。

  二、什么是反射

  主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。Java中,反射是一种强大的工具。它使您能够创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代表链接。反射允许我们在编写与执行时,使我们的程序代码能够接入装载到JVM中的类的内部信息,而不是源代码中选定的类协作的代码。这使反射成为构建灵活的应用的主要工具。但需注意的是:如果使用不当,反射的成本很高。

  三、怎么使用

  主要方法:

  1.得到Class对象 三种方式

  (1)Class.forName("类的字符串全名")

  Class<?> clazz = Class.forName("com.chapter14.Student");

  (2)使用类.class 获得该类对应的Class对象

  Class<?> clazz = Student.class;

  (3)对象.getClass()方法

  Object object = new Student();

  Class<?> clazz = object.getClass();

  2.得到构造函数 创建对象

  (1)Object o = clazz.newInstance(); //Object o = new Student();

  (2)使用Constructor创建对象,带declare 是得到所有访问权限的,不带declare是得到public的

  得到所有构造函数:Constructor[] consArr clazz.getDeclaredConstructors();

  Class[] clazzArr = new Class[]{int.class,String.class,int.class}; Constructor c = clazz.getDeclaredConstructor(clazzArr);

  Object o = c.newInstance(1,"aaa",22);

  3.得到方法,调用方法(对于方法来说declared能显示4种访问权限,不加declared 只有public + 父类的方法)

  得到所有方法:Method[] methodArr = clazz.getDeclaredMethods();

  对象.方法名(参数);

  方法名.invoke(对象,参数);

  4.得到属性

  Field name = clazz.getDeclaredField("name"); name.setAccessible(true);//设值属性的访问性 破坏了封装

  5.动态创建数组

  String[] strArr = new String[5];

  strArr[0] = "aaa";

  Object objArr = Array.newInstance(String.class, 5);

                                                                                                    技术分享:www.kaige123.com

© 著作权归作者所有

共有 人打赏支持
凯哥学堂
粉丝 15
博文 309
码字总数 275987
作品 0
东城
程序员

暂无文章

c语言之内存分配笔记

先看一个数组: short array[5] = {1,2} // 这儿定义的一个int类型的数组,数组第1和第2个元素值是1和2.其余后面默认会给值为0; 或者 short array[] = {1,2};//这儿数组第1和第2个元素,数组...

DannyCoder
42分钟前
0
0
Shell | linux安装包不用选择Y/N的方法

apt-get install -y packageOR echo "y" | sudo apt-get install package

云迹
今天
1
0
Hadoop的大数据生态圈

基于Hadoop的大数据的产品圈 大数据产品的一句话概括 Apache Hadoop: 是Apache开源组织的一个分布式计算开源框架,提供了一个分布式文件系统子项目(HDFS)和支持MapReduce分布式计算的软件架...

zimingforever
今天
4
0
八大包装类型的equals方法

先看其中一个源码 结论:八大包装类型的equals方法都是先判断类型是否相同,不相同则是false,相同则判断值是否相等 注意:包装类型不能直接用==来等值比较,否则编译报错,但是数值的基本类型...

xuklc
今天
2
0
NoSQL , Memcached介绍

什么是NoSQL 非关系型数据库就是NoSQL,关系型数据库代表MySQL 对于关系型数据库来说,是需要把数据存储到库、表、行、字段里,查询的时候根据条件一行一行地去匹配,当量非常大的时候就很耗...

TaoXu
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部