一、反射是个啥

  定义 : 在运行状态中动态获取类的信息以及动态调用对象的方法,这种功能称为java语言的反射机制。

  • 对于任意一个类,都能够知道这个类的所有属性和方法。
  • 对于任意一个对象,都能够调用它的任意一个方法和属性。

二、Class对象

  定义 : 我们在开发过程中,创建的每一个类也是对象,即类本身是java.lang.Class类的实例对象,我们称这个实例对象为类对象,也就是Class对象。

  学习反射前我们先要了解类对象有什么用:

  • Class 类的实例对象表示正在运行的 Java 应用程序中的类和接口。
  • Jvm中有很多的实例,每个类都有唯一的Class对象。 Class 类没有公共构造方法。
  • Class 对象是在加载类时由 Java 虚拟机自动构造的。也就是说我们不需要创建,JVM已经帮我们创建了。
  • Class 对象用于提供类本身的信息,比如有几种构造方法, 有多少属性,有哪些普通方法 。

  获取Class对象有以下几种方法:

  • Class.forName()(常用)
  • Test.class
  • new Test().getClass()
/**
* 反射机制demo
*/
public class Test {
public static void main(String args[]) throws Exception {
/*获取类对象的三种方法*/
//1、Class.forName()(常用)
Class class1 = Class.forName("zhbf.web.Test");
//2、Test.class
Class class2 = Test.class;
//3、new Test().getClass()
Class class3 = new Test().getClass(); /*三种方式创建的类对象调用其中的方法*/
Method method1 = class1.getMethod("printSome",String.class);
method1.invoke(class1, "class1");
Method method2 = class2.getMethod("printSome",String.class);
method2.invoke(class2, "class2");
Method method3 = class3.getMethod("printSome",String.class);
method3.invoke(class3, "class3");
} public static void printSome(String className) {
System.out.println(className + "通过反射机制获取方法并调用~");
}
}

运行main方法:

三、利用反射机制创建对象

步骤:

/*创建对象的流程*/
//1.获取类对象
Class classTest = Class.forName("zhbf.web.Test");
//2.获取构造器对象(入参为选用的构造方法的参数类型)
Constructor con = classTest.getConstructor();
//3 获取对象
Test test = (Test) con.newInstance();
  • getConstructors() :所有"公有的"构造方法
  • getDeclaredConstructors() :获取所有的构造方法(包括私有、受保护、默认、公有)
  • getConstructor(构造方法的参数类型) :  获取单个的"公有的"构造方法
  • getDeclaredConstructor(构造方法的参数类型) : 获取"某个构造方法"可以是私有的,或受保护、默认、公有;
  • newInstance() : 获取对象

四、获取成员变量并使用

常用方法:

  • getField(属性名) : 只能获取public的,包括从父类继承来的字段
  • getDeclaredField(属性名) :  获取本类包括public、private和proteced的字段,但是不能获取继承来的字段
  • getDeclaredFields() : 获得某个类的所有声明的字段,即包括public、private和proteced,但是不包括父类的申明字段
  • setAccessible(布尔值): 设置变量是否可访问
/*获取属性并修改*/
ZhbfwebApplicationTests testClass = new ZhbfwebApplicationTests();
//获取ZhbfwebApplicationTests类里访问权限为private的变量name
Field field = Class.forName("zhbf.web.ZhbfwebApplicationTests").getDeclaredField("name");
//设置变量可访问(ture)
field.setAccessible(true);
//上一步设置后,可对private的变量进行从新赋值
field.set(testClass, "wlx");
//打印从testClass对象里面获取的name变量
System.out.println(field.get(testClass));

五、获取成员方法并使用

常用方法:

  • getMethod(方法名 ,入参类型)  : 获取"公有方法";(包含了父类的方法也包含Object类)
  • getDeclaredMethods(方法名 ,入参类型)  : 获取成员方法,包括私有的(不包括继承的)
  • invoke(对象,参数) : 调用方法
//调用方法并传入参数
Class class1 = Test.class;
Method method = class1.getMethod("printSome", String.class);
method.invoke(class1, "class1");

六、反射的常见应用

  反射的常见应用场景如下:

Spring框架的配置文件设计思想

  Spring框架的配置文件一般命名为application.properties,公用的配置一般都写在这里面,为什么要以这种方式来写入公共的信息呢?

  场景举例例如我们需要配置数据库连接信息:

  • 写在代码里,修改数据库连接地址就需要重新编译,相当麻烦
  • 写在配置文件里,利用反射机制读取,不用从新编译,只需要修改单独的配置文件内容就好。

代码:

/**
* 反射机制读取文件
*/
public class Test { public static void main(String args[]) throws Exception {
//从application.properties中获取类名称和方法名称
File springConfigFile = new File("E:\\MyOwnGit\\ZHBF\\ZHBF-WEB\\src\\main\\resources\\application.properties");
//Properties是Java语言的配置文件所使用的类,Xxx.properties为Java 语言常见的配置文件
Properties springConfig = new Properties();
//文件输入流读取文件内容
springConfig.load(new FileInputStream(springConfigFile));
String driverClass = (String) springConfig.get("spring.datasource.driver-class-name");
String url = (String) springConfig.get("spring.datasource.url");
String username = (String) springConfig.get("spring.datasource.username");
String password = (String) springConfig.get("spring.datasource.password");
System.out.println("=====输出数据库配置=====");
System.out.printf("驱动类:%s url:%s 用户名:%s 密码:%s", driverClass, url, username, password);
} }

输出:

修改配置文件后输出:

Java基础一篇过(一)反射的更多相关文章

  1. java基础之轻松搞定反射

    前言 java的名词太古怪.反射白话文解释,就是把一个字符串的类名,实例化,少了个new单词. 反射步骤 准备一个苹果类像这个样子. public class PingGuo { private St ...

  2. java基础——入门篇

    整体大纲图 1.认识java 核心知识点:JVM.搭建Java开发环境.java的发展史.java特点.java程序类型.垃圾收集器.J2SE下载和安装.环境变量的配置和测试.以及简单的开发工具的使用 ...

  3. 【Java基础总结】Java基础语法篇(上)

    Java基础语法 思维导图 一.Java语言介绍 1.Java应用平台 JavaSE(Java Platform Standard Edition):开发普通桌面和商务应用程序,是另外两类的基础 Ja ...

  4. 「Java面试题/知识点精华集」20000+字的Java基础知识篇(2020最新版) !

    本文已经收录进我的 79K Star 的 Java 开源项目 JavaGuide:https://github.com/Snailclimb/JavaGuide (「Java学习+面试指南」一份涵盖大 ...

  5. Java基础加强笔记——测试、反射、注解

    目录 1. Junit单元测试 2. 反射 3. 注解 Junit单元测试: 测试分类: 1. 黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值. 2. 白盒测试:需要写代码的.关注程序具 ...

  6. [Think In Java]基础拾遗2 - 多态、反射、异常、字符串

    目录 第八章 多态第十四章 类型信息第十二章 通过异常处理错误第十三章 字符串 第八章 多态 1. 前期绑定 & 后期绑定 绑定是指将方法调用同一个方法主体关联起来的这么一个过程.如果在程序执 ...

  7. Java基础复习笔记系列 十三 反射机制

    主题:Java反射机制 学习资料参考网址: 1.http://www.icoolxue.com 1.Java反射机制. 各种框架中都使用到了Java的反射机制. 两个类:java.lang.Class ...

  8. Java基础系列篇:JAVA多线程 并发编程

    一:为什么要用多线程: 我相信所有的东西都是以实际使用价值而去学习的,没有实际价值的学习,学了没用,没用就不会学的好. 多线程也是一样,以前学习java并没有觉得多线程有多了不起,不用多线程我一样可以 ...

  9. JAVA基础知识总结18(反射)

    反射技术: 其实就是动态加载一个指定的类,并获取该类中的所有的内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员.简单说:反射技术可以对一个类进行解剖. 反射的 ...

随机推荐

  1. 第3篇 Scrum 冲刺博客

    1.站立会议 照骗 进度 成员 昨日完成任务 今日计划任务 遇到的困难 钟智锋 确定客户端和服务器通信的形式 重新设计项目执行流程 我的规划过于混乱,对应难以同步开发 庄诗楷 绘制棋盘 游戏窗口的制作 ...

  2. 整站死链接检测与查询工具 Xenu(可以用来制作sitemap)

    http://www.wocaoseo.com/thread-286-1-1.html 很多新手朋友们都会去找一些工具来检查网站死链接,这里给大家分享一款非常好用的检查网站死链接的工具xenu,大家可 ...

  3. 做SEO必须制定超越竞争对手网站的方案

    http://www.wocaoseo.com/thread-131-1-1.html       从开始终学习SEO技术,到现在半年过去了,其间也做了几个站,可是赚钱的并不多,有流量的也不多,虽然说 ...

  4. js区别对象和数组的三种方法

    var arr = {}||[];            区分arr是数组还是对象            1.arr.constructor                              ...

  5. 【Android】AndroidStudio打包apk出现的一些问题 `Error:Execution failed for task ':app:lintVitalRelease'.

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985, QQ986945193 公众号:程序员小冰 1,错误代码: `Error:Execution fai ...

  6. MySQL 增删查改 必知必会

    MySQL 数据库中的基础操作 3.表的修改 对表的表名.字段.字段类型.字段长度.约束等进行修改. 3.1 表的名称修改 -- 语法: ALTER TABLE 库名.表名 RENAME TO 新表名 ...

  7. C++STL中vector的初始化

    vector的初始化有很多方式,在N维初始化时还会一些容易出现错误的地方.下面进行总结 以下的总结均以int作为模板参数 一维vector的初始化 vector的构造函数通常来说有五种,如下: vec ...

  8. JS的全局变量无法给Ajax里的变量赋值

    前阶段遇到这么一个问题,在JS定义一个全局变量,JS方法里的其他地方都能使用,偏偏ajax里无法赋值,也不是无法赋值,但赋值总是慢一拍,具体的解决方案如下图所示:

  9. Hexo博客迁移

    Hexo用户指南 - 博客迁移 GitHub+Hexo搭建博客的过程比较平滑,但是它的配置却非常耗时,一旦电脑出现问题或者需要在另外一台电脑上写博客,那么Hexo博客的迁移非常就让人头疼.下面参考其他 ...

  10. 2020重新出发,NOSQL,MongoDB分布式集群架构

    MongoDB分布式集群架构 看到这里相信你已经掌握了 MongoDB 的大部分基本知识,现在在单机环境下操作 MongoDB 已经不存在问题,但是单机环境只适合学习和开发测试,在实际的生产环境中,M ...