一、反射的概念

是指在运行过程中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用这个对象的所有方法和属性。这种动态获取信息和动态调用方法的功能称为JAVA的反射机制。

二、反射的优缺点

2.1、优点

通过反射的概念我们已经知道反射的优点是:使程序能够访问到装载到JVM中的类的内部信息(成员变量和成员方法)

2.2、缺点

性能问题:反射是一种解释操作,通过反射来访问字段和调用方法时要慢于直接代码

使用反射会模糊程序内部逻辑:反射绕过了源代码,使用反射后开发人员无法通过查看源代码来判断业务逻辑,会带来维护问题。使用反射往往比直接代码更复杂。

ps:Java反射机制主要应用在对灵活性和扩展性要求很高的系统框架上,普通程序不建议使用。

三、反射的使用

3.1、使用反射API来实例化对象

第一步获取Class实例,有三种方式

Class.forName(是不是很熟悉,JDBC通常通过此方式来获取数据库连接驱动类)

.class

getClass()

第二步使用Class的方法来实例化对象,有两种方式

第一种方式newInstance()

第二种方式

Constructor constructor = clazz.getConstructor();
constructor.newInstance();

话不多说,赶紧上代码

package com.cc.reflect.bean;public class Student
{private int id;private String name;@Overridepublic String toString(){return "Student [id=" + id + ", name=" + name + "]";}
}
package com.cc.reflect;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;import com.cc.reflect.bean.Student;/*** * @描述: 使用反射API来实例化对象* @版权: Copyright (c) 2019 * @作者: 程冲* @版本: 1.0 * @创建日期: 2019年5月17日 * @创建时间: 上午8:35:04*/
public class InstanceStudent
{public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SecurityException, IllegalArgumentException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException{//1 第一步获取Class实例
//        Class clazz = getClassByFullName("com.cc.reflect.bean.Student");//适用于知道类的完整路径名Class clazz = getClassByName();//适用于编译前就明确要操作的类
//        Student student = new Student();Class clazz = getClassByObject(student);//适用于存在可以操作的实例//2 第二步使用Class的方法来实例化对象
//        Object obj = getInstance1(clazz);//直接通过字节码文件来实例化对象,必须有无参构造器Object obj = getInstance2(clazz);//通过构造对象来实例化对象//3 第三步对象初始化Field fieldId = clazz.getDeclaredField("id");fieldId.setAccessible(true);fieldId.set(obj, 1);Field fieldName = clazz.getDeclaredField("name");fieldName.setAccessible(true);fieldName.set(obj, "张三");//上面的方法破坏了类成员的访问规则,一般不建议这么做System.out.println(obj);}private static Class getClassByFullName(String fullName) throws ClassNotFoundException{return Class.forName(fullName);}private static Class getClassByName(){return Student.class;}private static Class getClassByObject(Object obj){return obj.getClass();}private static Object getInstance1(Class clazz) throws InstantiationException, IllegalAccessException{return clazz.newInstance();}private static Object getInstance2(Class clazz) throws SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException{Constructor constructor = clazz.getConstructor();return constructor.newInstance();}
}

ps:本文只介绍了使用反射来实例化对象,有兴趣可以自己去研究一下如何访问类的属性、调用类的方法,比较简单。

【JAVA基础篇】反射相关推荐

  1. Android面试题Java基础篇

    Android面试题Java基础篇,由本人整理汇总,后续将继续推出系列篇,如果喜欢请持续关注和推荐,更多精彩内容可以关注微信公众号(Android高级编程):android-tech 系列文章目录: ...

  2. 《Java 后端面试经》Java 基础篇

    <Java 后端面试经>专栏文章索引: <Java 后端面试经>Java 基础篇 <Java 后端面试经>Java EE 篇 <Java 后端面试经>数 ...

  3. 【程序员养成之路】Java基础篇 8-流进流出的IO流(二)

    以下内容若有误,欢迎私信我或在下方留言,谢谢^_− 目录 IO流(二) 1.特殊操作流 1.1 标准流 1.2 打印流 1.3 对象序列化流 1.4 Properties 拓展1:比较字节流和字节缓冲 ...

  4. 高频面试真题答案 -java后端 -java基础篇

    原贴 2022届秋招高频面试真题汇总,千题奉送!!!- 后端篇_笔经面经_牛客网 整理答案: 类加载机制 47 双亲委派机制 24 new一个对象的过程 4 java程序是如何运行起来的? 1 jvm ...

  5. 你所需要的java基础篇深入解析大汇总

    java基础篇深入解析大总结 java基础(一) 深入解析基本类型 java基础(二) 自增自减与贪心规则 java基础(三) 加强型for循环与Iterator java基础(四) java运算顺序 ...

  6. Java基础篇4——数组

    Java基础篇4--数组 1.数组的概念 当需要在Java程序中记录单个数据内容时,则声明一个变量即可 当需要在Java程序中记录多个类型相同的数据内容时,则声明一个一维数 组即可,一维数组本质上就是 ...

  7. Java基础篇3——流程控制

    Java基础篇3--流程控制 1.顺序结构 正常代码的流程即是顺序流程 2.分支结构 2.1.if-else分支 if(条件表达式) {语句块1; } if(条件表达式) {语句块1; } else ...

  8. Java基础篇2——运算符

    Java基础篇2--运算符 1.运算符 1.1.算数运算符 +表示加法运算符 -表示减法运算符 *表示乘法运算符 /表示除法运算符 %表示取余运算符 1.2.关系运算符 所有以关系运算符作为最终运算的 ...

  9. Java基础篇1——变量与数据类型

    Java基础篇1--变量与数据类型 1.标识符命名规则 标识符以由大小写字母.数字.下划线(_)和美元符号($)组成,但是不能以数字开头. 大小写敏感 不能与Java语言的关键字重名 不能和Java类 ...

  10. 菜鸟学习笔记:Java基础篇7(包装类、时间相关类、文件类、异常处理类)

    菜鸟学习笔记:Java其他常用类 基本数据类型包装类 时间处理和文件处理相关类 Date时间类 SimpleDateFormat Calendar日历类 文件类 异常机制 异常的概念 Java异常处理 ...

最新文章

  1. OBjective-C:文件管理类NSFileManager
  2. python中常用的语句元素
  3. fiddler网络代理原理图_Fiddler–HTTP代理神器
  4. JDK源码解析之 Java.lang.Object
  5. 从汇编的眼光看C++(之递归函数与模板类)
  6. ScrollView垂直滚动控件
  7. R语言与数据挖掘学习笔记(常用的包)
  8. 严蔚敏数据结构课后参考答案
  9. 微博html5版转换成网页版,微博网页版html5入口
  10. Linux编译安装iozone,Fedora下NFS的配置与iozone测试
  11. 运算放大器(OPA)超详细参数讲解-运放---以及8个型号的运算放大器分析对比
  12. MAC读取NTFS移动硬盘方法
  13. IOM计算机组成原理,计算机组成原理-实验1静态随机存储器实验
  14. Web变灰-grayscale
  15. 高德地图 坐标与地址
  16. python ftp上传/下载文件,带进度条显示
  17. JAVA 图片地址路径转换 Base64 工具类
  18. iphone免越狱插件_如何保护iPhone免受盗贼的侵害
  19. 如果你有一个ods,里面需要放进去2个country的信息:ship-to coutry和 sold-to country,你怎么做?
  20. Python 写商品清单(加入购物车)

热门文章

  1. 360浏览器收藏夹_换了一台电脑,浏览器收藏的网站不见了,咋办?
  2. 计算机windows10属性配置,电脑显示属性设置,教你win10系统电脑显示属性的设置教程...
  3. python实现接口自动化_python 实现接口自动化1
  4. 单片机检测电机频率c语言,基于51单片机的电动机测速表的设计.doc
  5. Vue-cli 3.X 构建工具零基础快速上手
  6. mybatis-plus大批量数据插入缓慢问题
  7. Oracle 表空间常用sql
  8. 03_SpringCloud整合Ribbon实现负载均衡
  9. java 获取ip地址_老杜带你学Java【第二课】
  10. python期末考试重点_如何应付大学的python考试而不至于挂科?