`

Java 之 反射(Reflection)

阅读更多
Java 之 反射(Reflection)

首先看书要理解反射,很难完全理解,这关系到Java的语言特性,jvm的内存细节,当初我看反射,就像高票答案那样,照着写一遍,结果是你并没有理解,你只是照猫画虎,要想真正理解,我建议题主,不断深入探究,当你踩得足够深回过头来,你会柳暗花明!这里我不打算像别的答案上来就上代码,给你讲怎么用,是啥是啥,老实说那样比较像培训java程序员的感觉,一点对知识的好奇心都没有,如果是想速成反射的,大家看别的答案吧。写答案,可能会有默认知识现象,就是有些知识点,我知道,但你不知道,可以评论!这里我试着简单粗暴地解释一波!





首先我们了解一下JVM,什么是JVM,Java的虚拟机,java之所以能跨平台就是因为这个东西,你可以理解成一个进程,程序,只不过他的作用是用来跑你的代码的。上图是java的内存模型,我们关注的点,一个方法区,一个栈,一个堆,初学的时候老师不深入的话只告诉你java的内存分为堆和栈,易懂点吧!假如你写了一段代码:Object o=new Object();运行了起来!首先JVM会启动,你的代码会编译成一个.class文件,然后被类加载器加载进jvm的内存中,你的类Object加载到方法区中,创建了Object类的class对象到堆中,注意这个不是new出来的对象,而是类的类型对象,每个类只有一个class对象,作为方法区类的数据结构的接口。jvm创建对象前,会先检查类是否加载,寻找类对应的class对象,若加载好,则为你的对象分配内存,初始化也就是代码:new Object()。上面的流程就是你自己写好的代码扔给jvm去跑,跑完就over了,jvm关闭,你的程序也停止了。为什么要讲这个呢?因为要理解反射必须知道它在什么场景下使用。题主想想上面的程序对象是自己new的,程序相当于写死了给jvm去跑。假如一个服务器上突然遇到某个请求哦要用到某个类,哎呀但没加载进jvm,是不是要停下来自己写段代码,new一下,哦启动一下服务器,(脑残)!  反射是什么呢?当我们的程序在运行时,需要动态的加载一些类这些类可能之前用不到所以不用加载到jvm,而是在运行时根据需要才加载,这样的好处对于服务器来说不言而喻,举个例子我们的项目底层有时是用mysql,有时用oracle,需要动态地根据实际情况加载驱动类,这个时候反射就有用了,假设 com.java.dbtest.myqlConnection,com.java.dbtest.oracleConnection这两个类我们要用,这时候我们的程序就写得比较动态化,通过Class tc = Class.forName("com.java.dbtest.TestConnection");通过类的全类名让jvm在服务器中找到并加载这个类,而如果是oracle则传入的参数就变成另一个了。这时候就可以看到反射的好处了,这个动态性就体现出java的特性了!举多个例子,大家如果接触过spring,会发现当你配置各种各样的bean时,是以配置文件的形式配置的,你需要用到哪些bean就配哪些,spring容器就会根据你的需求去动态加载,你的程序就能健壮地运行。答案比较粗糙,点到为止!

你可以理解成类存在方法区中,类的class对象存在于堆中,这个class对象会作为运行时创建该类对象的模版。这个class对象是唯一对应该类的,要区分所谓的实例和class对象。为什么需要class对象,你想下如果一个加载进方法区的类,在jvm运行时是动态加载进来的,没有这个class对象你思考该如何访问一个未知的类并创建对象呢?没错就是这个class作为访问接口。








作者:老顽童周伯通
链接:https://www.zhihu.com/question/24304289/answer/147529485















=
  • 大小: 42.3 KB
分享到:
评论

相关推荐

    Java Reflection (JAVA反射)详解

    Java 反射(Reflection)是Java编程语言的一个重要特性,它允许程序在运行时动态地获取类的信息(如类名、方法、字段等)并直接操作对象的内部属性。这为开发者提供了强大的灵活性,能够在不预先知道具体类的情况下...

    Java Reflection (JAVA反射)

    ### Java反射机制详解 #### 一、Java反射机制概述 反射是Java编程语言的一个关键特性,它赋予了Java程序在运行时自我检查的能力,并能够直接操纵程序内部的属性。通过反射,开发者可以在运行时获取类的信息(如...

    javaReflection反射机制.ppt

    之前上课的时候老师总结的JavaReflection反射学习资料,内容简单易懂,浅显易懂,适合小白入手学习。。

    java之反射优化(缓存思路)源码

    在Java编程中,反射(Reflection)是一个强大的工具,它允许我们在运行时检查和操作类、接口、字段和方法。然而,反射操作通常比直接的Java代码执行慢,因为它涉及到动态类型检查和方法调用。因此,为了提高性能,...

    Java Reflection (JAVA反射.mht

    Java Reflection (JAVA反射.mht

    JAVA 私塾笔记整理——反射机制(Reflection)

    总结,Java反射机制是其强大之处,它为开发者提供了超越静态类型系统的灵活性。然而,也应谨慎使用,避免滥用反射导致的性能下降和潜在的安全隐患。通过阅读"JAVA私塾笔记整理——反射机制(Reflection)",你可以更...

    圣思园 reflection(Java反射) 课件

    Java反射机制是Java编程语言中一个强大的工具,它允许程序在运行时检查和操作类、接口、字段和方法的信息。通过反射,开发者可以在程序执行过程中动态地获取类的信息并进行操作,这为Java应用程序提供了高度的灵活性...

    反射Reflection小应用

    在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作类、接口、字段和方法的信息。通过反射,我们可以动态地创建对象、调用方法、访问字段,甚至处理私有成员,这在某些情况下非常...

    Java 反射(Reflection) 经典实用例子

    Java提供了一套机制来动态执行方法和构造方法,以及数组操作等,这套机制就叫——反射。反射机制是如今很多流行框架的实现基础,其中包括Spring、Hibernate等。原理性的问题不是本文的重点,接下来让我们在实例中...

    java reflection in action

    在《Java Reflection in Action》这本书中,作者深入探讨了这一主题,帮助开发者理解并有效地利用Java反射机制。这本书是2005年出版的英文版,对于想要提升Java编程技能,特别是对动态类型和元编程感兴趣的开发者来...

    Java Reflection in Action

    "Java Reflection in Action"这本书详细阐述了这些概念,并通过实际示例帮助读者掌握如何在项目中有效且安全地使用Java反射。无论是初学者还是经验丰富的开发者,都能从中受益,提升对Java动态特性的理解。

    Java反射机制的实现_Reflection

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。通过Java反射机制,开发者可以在不知道具体类名的情况下创建对象,调用方法,访问和修改私有成员变量,以及...

    Java反射经典实例 Java Reflection Cookbook[1].pdf

    通过以上实例,我们可以看到Java反射机制的强大之处,它可以让我们在运行时动态地操作类、字段、方法等。然而,需要注意的是反射操作通常比普通操作要慢,并且可能会导致安全性问题,因此在实际开发中应当谨慎使用。...

    Reflection_in_Java.zip_in_java 反射_java 反射机制_java反射_反射机制

    Java反射机制是Java编程语言中一个强大的特性,它允许运行时的程序动态地获取类的信息并操作类的对象。在Java中,反射主要涉及到`java.lang.Class`类、`java.lang.reflect`包下的类如`Constructor`、`Method`和`...

    Java Reflection(JAVA反射)详解

    Java反射是Java编程语言的核心特性之一,它允许程序员在运行时检查和操作类、接口、字段和方法等对象。这使得Java程序具有高度的灵活性和动态性,可以在不事先知晓具体类信息的情况下处理对象。 首先,要使用Java...

    java面试题--反射机制

    动态加载类是Java反射机制的重要应用场景之一。通过`Class.forName()`方法或者`ClassLoader`的`loadClass()`方法,可以根据类名字符串在运行时加载类。 #### 七、操作成员 - **创建对象**:使用`Class`对象的`new...

    java 通过反射获取枚举类,及枚举类的值,枚举类枚举实例名

    在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作类、接口、字段和方法等对象。枚举(Enumeration)是Java中的一个特殊类类型,用于定义一组常量。本项目"test-enum-demo-...

    Java反射性能测试分析

    ### Java反射性能测试分析 ...- [Java Reflection and Performance: A Deep Dive](https://www.baeldung.com/java-reflection-performance):一篇深入分析Java反射性能的文章,包含更多的测试案例和优化建议。

Global site tag (gtag.js) - Google Analytics