概述:反射是java中最强大的技术之一,很多高级框架都用到了反射技术,面试中也是经常问的点,所以搞懂反射非常重要!

文章目录

  • 1.反射是什么?
  • 2.反射的底层原理
  • 3.三种方式获取Class对象
  • 4.反射的优缺点
  • 5.反射的应用场景
  • 6.反射的常用API

1.反射是什么?

java反射机制指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都可以知道它是什么类的对象,并且能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法功能称为java语言的反射机制.
丢了堆概念,大家可能看的就懵逼了,接下来举个简单的例子让大家来了解什么叫动态的获取和动态的调用。

动态获取类的信息例子:
代码

        Class real= user.class;System.out.println(real.getPackage());System.out.println(real.getName());System.out.println(real.getSimpleName());System.out.println("user类的所有字段属性,包括public private protected");Field[] fieldds= real.getDeclaredFields();//获取user类中所有的字段for(Field field : fieldds){# System.out.println(field);System.out.println(field.getName());}System.out.println("user类的所有公共方法,只有public");Method[] methods=real.getMethods();for(Method method: methods){System.out.println(method.getName());}

运行结果:

截图没有截完。
从这个例子我们可以看到,我们通过Class这个类型的对象的API就知道了user这个类的属性和方法,这就叫做动态获取类的信息。
同理,接下来我们又看动态调用的例子。
代码:

 Class real=user.class;Method method=real.getMethod("show");#user类里的show方法.
method.invoke(real.newInstance());#newInstance是new一个real类的对象,因为你要调用非static方法的话必须是去对象中访问那个方法。

运行效果:

2.反射的底层原理

我们平时编写的文件都是*.java文件,经过jdk里面的javac编译器编译后就变成了一堆*.class文件,然后类加载器会将class文件加载到JYM虚拟机的内存中,此时会自动创建一个Class对象(由始至终只有一个)去存储这个类的相关信息(构造器,成员变量,方法等等)。我们可以利用这个Class对象去动态的创建对象和动态的调用对象的方法。

3.三种方式获取Class对象

#通过class.forname()来获取Class对象
Class nice=Class.forName("com.example.questions.bean.user");
#通过类名来获取对象, 前提是该类必须能在当前项目中找到
Class real= user.class;
#通过对象的.getClass方法来获取Class notgoodway=user1.getClass();

4.反射的优缺点

静态编译:在编译时确定类型,绑定对象,即通过。
动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多态的应用,有以降低类之间的藕合性。
反射机制的优点:可以实现动态创建对象和编译,体现出很大的灵活性(特别是在J2EE的开发中它的灵活性就表现的十分明显)。通过反射机制我们可以获得类的各种内容,进行了反编译。对于JAVA这种先编译再运行的语言来说,反射机制可以使代码更加灵活,更加容易实现面向对象。
反射机制的缺点:对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它 满足我们的要求。这类操作总是慢于只直接执行相同的操作。

5.反射的应用场景

待更

6.反射的常用API

1.获取类名

Class aClass = MyObject.class;
String className = aClass.getName();

2.获取类权限修饰符

#使用Class对象可以获取一个类的修饰符.类的修饰符即关键字"public","private", "static"等. 如下:Class aClass = MyObject.class;int modifiers = aClass.getModifiers();

3.获取包信息

使用Class对象可以获取包信息,如下:
Class aClass = MyObject.class;
Package package = aClass.getPackage();
String packageName = package.getname();

4.获取父类

Class  aClass = MyObject.class;
Class superclass = aClass.getSuperclass();

5.获取实现的接口

Class aClass = MyObject.class;
Class[] interfaces = aClass.getInterfaces();

注意:只有给定类声明实现的接口才会返回。例如,如果类A的父类B实现了一个接口C,但类A并没有声明它也实现了C,那么C不会被返回到数组中。即使类A实际上实现了接口C,因为它的父类B实现了C。

6.获取构造函数

Class aClass = MyObject.class;
Constructor[] constructors = aClass.getConstructors();

7.获取方法

Class aClass = MyObject.class;
Method[] methods = aClass.getMethods();

8.获取属性

Class aClass = MyObject.class;
Field[] fields = aClass.getFields();

9.获取类的注解

Class aClass = MyObject.class;
Annotation[] annotations = aClass.getAnnotations();

10.使用Method对象调用方法

Method method = MyObject.class.getMethod("doSomething", String.class);
Object returnValue = method.invoke(null, "parameter-value1");

空参数是你想要调用该方法的对象。如果该方法是静态的,使用null,而不是一个对象实例。在这个例子中,如果doSomething(String.class)不是静态的,你需要提供有效的MyObject实例而不是null作为参数;
Method.invoke(Object target, Object …parameters)方法接受可变长度的参数,但是你在调用时必须为每一个参数提供一个准确的参量。在这个例子中,方法以字符串作为参数的,所以必须提供一个字符串。

11.获取方法的参数和返回值类型

Method method = ... //获取 method – 如上
Class[] parameterTypes = method.getParameterTypes();
Method method = ... // obtain method - see above
Class returnType = method.getReturnType();

后续遇到什么API再补上

彻底搞懂java反射技术及其原理相关推荐

  1. 信不信十分钟让你彻底搞懂java反射

    有反射就有正射 直接new对象就叫正射 如下 Map<String, String> map = new HashMap<>(); map.put("蔡徐鸡" ...

  2. 【Java】一文搞定Java反射技术

    Java基础之反射 一.类加载器 1.类的加载 2.类的加载时机(进入内存) 3.类加载器 4.类加载器的组成 二.反射 1.Class类 2.通过反射获取构造方法并使用 三.反射练习 1.泛型擦除 ...

  3. 搞懂Java的反射机制

    搞懂Java的反射机制 1.什么是反射? java的反射机制是指可以在运行状态下获取类和对象的所有属性和方法. 2.反射的作用? 1.在运行时获取一个类/对象的成员变量和方法 2.在运行时创建一个类的 ...

  4. 彻底搞懂Java的网络IO

    IO是Input/Output的缩写.Unix网络编程中有五种IO模型: blocking IO(阻塞IO) nonblocking IO(非阻塞IO) IO multiplexing(多路复用IO) ...

  5. 5张图搞懂Java深浅拷贝

    微信搜一搜 「bigsai」 关注这个专注于Java和数据结构与算法的铁铁 文章收录在github/bigsai-algorithm 欢迎star收藏 如果本篇对你有帮助,记得点赞收藏哦! 在开发.刷 ...

  6. 一文搞懂 Java 线程中断

    转载自   一文搞懂 Java 线程中断 在之前的一文<如何"优雅"地终止一个线程>中详细说明了 stop 终止线程的坏处及如何优雅地终止线程,那么还有别的可以终止线程 ...

  7. 搞懂 Java HashMap 源码

    HashMap 源码分析 前几篇分析了 ArrayList , LinkedList ,Vector ,Stack List 集合的源码,Java 容器除了包含 List 集合外还包含着 Set 和 ...

  8. JVM - 结合代码示例彻底搞懂Java内存区域_对象在堆-栈-方法区(元空间)之间的关系

    文章目录 Pre 示例demo 总体关系 代码示例论证 反汇编 Pre JVM - 结合代码示例彻底搞懂Java内存区域_线程栈 | 本地方法栈 | 程序计数器 中我们探讨了线程栈中的内部结构 ,大家 ...

  9. java开发可重用代码包工具包_[Java教程]彻底搞懂Java开发工具包(JDK)安装及环境变量配置...

    [Java教程]彻底搞懂Java开发工具包(JDK)安装及环境变量配置 0 2021-01-04 04:00:04 安装并配置JDK环境变量,不但要知道怎样做,也要知道为什么这样做,知其然知其所以然. ...

最新文章

  1. python 中sys.stdout.write 和 print sys.stdout的区别(转)
  2. MySQL 打开federated存储引擎
  3. 实验四 [bx]和loop的使用+段前缀
  4. MySql连接查询与联合查询
  5. Python学习(四) —— 编码
  6. SAP Spartacus url里默认electronics-spa的由来
  7. 【矩阵乘法】生成树计数(luogu 2109/NOI 2007)
  8. Rds基于mysql开发的_开发云数据库RDS MYSQL版讲解
  9. AD19 add pins to nets错误_《英雄联盟手游》错误代码问题大全 LOL的错误代码都是什么意思...
  10. 吴恩达机器学习笔记二之多变量线性回归
  11. chrome 插件下载
  12. PowerDesigner--创建概念数据模型;并生成逻辑数据模型/物理数据模型/数据库SQL脚本
  13. 数据结构与算法 c语言6,C语言程序设计题库之6.doc
  14. 别人眼中的程序猿和现实中的程序猿差别在哪?
  15. 敏捷开发之极限编程(XP)概念
  16. 史上最简单的spark教程第十三章-SparkSQL编程Java案例实践(终章)
  17. ApkScan-PKID查壳工具+脱壳(搬运)
  18. Collectors.toList()的作用
  19. c语言记录键盘敲击次数,【转】你知道一天敲键盘的敲击次数能达到多少么
  20. 以数据智能引领产业数字化,滴普科技宣布完成5000万美元A+轮融资

热门文章

  1. 2MSL导致的服务器端口占用问题
  2. UltraISO下载
  3. PaddleSeg:车道线检测
  4. 队列的简单实现(C语言)
  5. Unity粒子系统图片材质制作
  6. 揭密玄学奥秘(一):风水, 姓名八字其实都是科学...
  7. 零基础小白-自学java全栈开发-学习路线-只要看这一篇就可以了(完整版)
  8. CSS+html:魔兽世界网页仿制
  9. 完整HTML实例网页代码(4)
  10. Profit Maximization for Viral Marketing in Online Social Networks: Algorithms and Analysis