关注程序员7歌,一起用技术改变世界

大家好,我是程序员7歌,今天我为大家讲解Java的反射机制。

首先我们来看看反射的概念:

Java反射说的就是在程序运行中,任何一个类,我们都可以知道这个类的方法和属性。对于任何一个Java对象,我们都可以对它的方法和属性进行调用。因此我们把这种动态获取Java对象信息和调用对象方法的功能称为Java反射机制。

如果我们想要使用Java的反射机制,必须要先获取该对象的字节码文件对象(.class),然后通过字节码文件对象,就能够通过该对象的方法获取我们想要的对象信息,比如:方法/属性/父类名/实现等所有接口信息等,每个对象对应着一个字节码文件(.class),也就是一个class类型的对象,既是字节码文件对象。

我们知道Java的一切操作都是在类中进行的,既万物皆是对象,类也是对象,是class的对象(类是对象,是java.lang.Class类的实例对象)

我们来看一个样例:class Test{},Test的实例对象就是Test test = new Test();我们知道Test类也是class的实例对象,因此Test的实例对象有三种表达式:

第一种:Class> ===> getClass() ===>返回Object的运行类,其实这个方法是Object的一个方法,Class继承了Object,因此我们可以直接使用。

public class Test {public static void main(String[] args) {//首先我们创建一个对象Test t1 = new Test();//然后获取这个类的Class对象Class c1 = t1.getClass();//然后获取这个类的名称System.out.println(c1.getName());}}

控制台输出内容如下:

com.test.controller.TestProcess finished with exit code 0

第二种:我们可以调用属性获取:

public class Test {public static void main(String[] args) {Class c1 = String.class;//然后获取这个类的名称System.out.println(c1.getName());}}

控制台输出内容如下:

Connected to the target VM, address: '127.0.0.1:64548', transport: 'socket'java.lang.StringDisconnected from the target VM, address: '127.0.0.1:64548', transport: 'socket'Process finished with exit code 0

第三种:可以使用forName方法获取,不过通过类的全路径获取Class对象会抛出一个异常,如果根据路径找不到这个类就会抛出异常,样例如下:

public class Test {public static void main(String[] args) {try{//根据类的全路径获取(必须用上全限定名,否则报错) Class c1 = Class.forName("com.test.controller.Test");System.out.println(c1.getName());}catch (Exception e){e.printStackTrace();}}}

控制台输出内容如下:

com.test.controller.TestProcess finished with exit code 0

在上面三种方法中,我们一般推荐第三种方式,因为第一种已经创建了对象,如果再用反射就是多此一举了;第二种我们需要导入类的相关包,类的依赖性太强了。因此我们推荐使用第三种方式。

接下来介绍几个方法,通过反射机制获取方法信息:

//获取所有的public的方法,包含父类继承的方法 c1.getMethods();

//获取所有该类自己声明的方法,不问访问权限是一个Method[]数组,得到方法的返回值类型的类类型Class c1.getDeclaredMethods()[i].getReturnType();

//得到参数列表的类型的类类型 Class[] c1.getDeclaredMethods()[i].getParameterTypes(); 我们样例看看如下:

public static void main(String[] args) {try{//跟据类的全路径获取Class c1 = Class.forName("com.test.controller.Test");Method[] methods = c1.getDeclaredMethods();for (int i = 0; i < methods.length; i++) {//返回方法的类型System.out.println(methods[i].getReturnType().getName());//方法名System.out.println(methods[i].getName());Class[] classes = methods[i].getParameterTypes();for (Class aClass : classes) {System.out.println(aClass.getName());}}}catch (Exception e){e.printStackTrace();}}

控制台输出内容如下:

voidmain[Ljava.lang.String;Process finished with exit code 0

接下来我们看看方法的反射:操作为:method.invoke(对象,参数列表),获取方法名称和参数列表决定,getMethod是获取public的方法,getDeclaredMethod获取自己申明的方法。

public class Test {public static void main(String[] args) {try{Test1 test1 = new Test1();Test2 test2 = new Test2();Class testClass1 = test1.getClass();Class testClass2 = test2.getClass();Method method1 = testClass1.getMethod("test1",int.class,int.class);method1.invoke(test1,1,2);Method method = testClass1.getMethod("test1");method.invoke(test1);Method method2 = testClass2.getMethod("test2", String.class, String.class);method2.invoke(test2,"zeng","xueqi");}catch (Exception e){e.printStackTrace();}}}class Test1{public void test1(){System.out.println("test1的方法");}public void test1(int a,int b) {System.out.print(a+b+"\n");}}class Test2{public void test2(String a,String b){System.out.println("test2的方法 ===> " + a + "/" + b);}}

控制台输出内容如下:

3test1的方法test2的方法 ===> zeng/xueqiProcess finished with exit code 0

看到这里我们大概已经对反射有一定的了解,可以使用反射来获取类的一些属性和方法,我们在使用一些主流的开发框架中用到反射机制的程序非常的广泛,因此我们反射机制还是有必要掌握的。

好了,今天就给大家介绍到这里吧,感谢大家观看喔~~❤️

java反射机制知识_Java反射机制讲解,程序员必须掌握的知识点相关推荐

  1. java 反射 工厂模式_Java反射机制demo(七)—反射机制与工厂模式

    Java反射机制demo(七)-反射机制与工厂模式 工厂模式 简介 工厂模式是最常用的实例化对象模式. 工厂模式的主要作用就是使用工厂方法代替new操作. 为什么要使用工厂模式?直接new不好吗? 直 ...

  2. java反射的原理_java反射机制的实现原理

    java反射机制的实现原理 反射机制: 所谓的反射机制就是java语言在运行时拥有一项自观的能力. 通过这种能力可以彻底的了解自身的情况为下一步的动作做准备. 下面具体介绍一下java的反射机制.这里 ...

  3. java反射重要么_JAVA反射----这些知识你需要知道

    前言: 在学习JAVA的反射之前我觉得很有必要花几分钟时间了解一下JVM的内存结构.如果一开始就说什么是反射,以及反射的API.这样做是很难真正的理解反射的. JVM是JAVA跨平台的核心,其结构为上 ...

  4. java反射三种_Java反射

    1.反射获取Class对象的三种方式 反编译 不是自己写的类,也不知道类里面有哪些方法 变量,让你能够使用程序上线了,修改程序但不终止程序的运行--反射 (1)Object类 getClass 方法 ...

  5. java反射随意值_Java反射总结

    能够分析类能力的程序称为反射.对于给定的Java类名,可以通过反射获取类的信息.将类的各成分映射出相应的Java类. Class类 在程序运行期间,Java运行时系统始终对所有的对象维护一个被称为运行 ...

  6. java反射源码_java反射技术详解附源码

    在学校学习Java时,由于学的不扎实,也没经历过太多实战项目,所以很多重要的知识点瞟一眼就过去了,比如现在要讲的反射,当时直接就忽略掉了,可现在发现很多地方需要反射,不得不重新学习一下,上学欠了太多债 ...

  7. java反射 数组类型_Java反射-数组

    通过反射使用数组有时会比较棘手.特别是需要获得一个特定类型数组的Class对象,如int[]等.本文将讨论如何通过反射创建数组和获得他们的Class对象. 注意:本文在阅读Eyal Lupu的博客&q ...

  8. java反射创建实例_Java反射创建实例

    Java反射创建实例 package com.wkcto.chapter08.demo02; import java.lang.reflect.Constructor; import java.lan ...

  9. java反射最佳实践_Java 反射最佳实践 – 码农网

    标签: 概要:最简单优雅的使用反射. 本文的例子都可以在示例代码中看到并下载,如果喜欢请star,如果觉得有纰漏请提交issue,如果你有更好的点子可以提交pull request.本文的示例代码主要 ...

最新文章

  1. 【跃迁之路】【605天】程序员高效学习方法论探索系列(实验阶段362-2018.10.09)...
  2. 基于倒谱法、自相关法、短时幅度差法的基音频率估计算法(MATLAB及验证)
  3. HTML里的表格不能复制粘贴,表格之间无法复制粘贴怎么办_两个EXCEL表格为什么不能复制和粘贴-win7之家...
  4. 华为史上最大规模升级!鸿蒙系统进度发布:近百款机型已适配
  5. 编程题:编写一个函数string_copy()完成strcpy()的作用,并验证。
  6. 用户信息持久化解决方案
  7. 农民工兄弟学C#(4)
  8. 系统集成项目管理工程师目录
  9. 使用免费的卡巴斯基清除木马
  10. 只需4步,微软数据科学家教你用OpenRefine搞定数据清洗
  11. 从饭店运作看mina线程模型
  12. fresco android 6.0 不支持 gif,Fresco Gif加载优化
  13. Speedoffice(word)如何快捷在方框内打钩
  14. STM32F4应用-GPIO
  15. 乐符识别matlab,GitHub - Nuullll/music-synthesizer: Homework No.1 for summer course: MATLAB
  16. Android通过gradle实现debug和release包名不同
  17. new bing聊天机器人免翻命令行使用--大佬逆向工程api
  18. 机场文员面试从何下手
  19. abaqus应力值导出并进行后处理(同一节点多个应力值如何处理?)
  20. 悲观锁和乐观锁的区别及使用场景

热门文章

  1. CCRD_TOC_2008年第6期
  2. 第八章 路由协议原理
  3. c++与java中子类中调用父类成员的方法
  4. 走进JavaScript响应式编程(Reactive Programming)
  5. “远程服务器返回错误: (404) 未找到”的正确解决方法
  6. hibernate开发错误及解决办法
  7. 构建高性能的ASP.NET应用(五)-如何开始寻找性能瓶颈
  8. 牛客c语言数组,牛客网学习笔记 - C/C++
  9. java接口与类相同不同_浅谈java的接口和C++虚类的相同和不同之处
  10. c语言结构体如何定义字母,c语言中定义结构体如何定义?