Java反射机制01-反射的概念以及获取字节码信息 的四种方式

一、反射的概念

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

在编译后产生字节码文件的时候,类加载器子系统通过二进制字节流,负责从文件系统加载class文件。
在执行程序(java.exe)时候,将字节码文件读入JVM中—>这个过程叫做类的加载。然后在内存中对应创建一个java.lang.Class对象–>这个对象会被放入字节码信息中,这个Class对象,就对应加载那个字节码信息,这个对象将被作为程序访问方法区中的这个类的各种数据的外部接口。
所以:我们可以通过这个对象看到类的结构,这个对象就好像是一面镜子,透过镜子看到类的各种信息,我们形象的称之为反射
这种“看透”class的能力(the ability of the program to examine itself)被称为introspection(内省、内观、反省)。Reflection和introspection是常被并提的两个术语。

说明:在运行期间,如果我们要产生某个类的对象,Java虚拟机(JVM)会检查该类型的Class对象是否已被加载。
如果没有被加载,JVM会根据类的名称找到.class文件并加载它。一旦某个类型的Class对象已被加载到内存,就可以用它来产生该类型的所有对象。

补充:
动态语膏vs静态语言
1、动态语言
是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以
被引进,已有的函数可以被删除或是其他结构上的变化。通俗点说就是在运
行时代码可以根据某些条件改变自身结构。
主要动态语言: Object-C、 C#、JavaScript、 PHP、 Python、 Erlang 。
2、静态语言
与动态语言相对应的,运行时结构不可变的语言就是静态语言。如Java、C、
C++。

所以Java不是动态语言,但Java可以称之为“准动态语言”。即Java有一定的动
态性,我们可以利用反射机制、字节码操作获得类似动态语言的特性。
Java的动态性让编程的时候更加灵活

二、学习反射前的代码准备

package com.bones.test01;/*** @Author:Bones* @Date:2021/11/30-11-30-4:21 下午* @Description:com.bones.test01* @version:1.0*/
public class Person {//属性private int age;public String name;//方法private void eat(){System.out.println("Person---eat");}public void sleep(){System.out.println("Person---sleep");}
}
package com.bones.test01;/*** @Author: Bones* @Date:2021/11/30-11-30-4:25 下午* @Description: com.bones.test01* @version: 1.0*/
public class Student extends Person {//属性:private int sno;double height;protected double weight;public double score;//方法:public String showInfo(){return "我是一名三号学生";}private void work(){System.out.println("找工作---->程序员");}//构造器public Student() {System.out.println("空参构造器");}public Student(int sno) {this.sno = sno;}public Student(int sno, double weight) {this.sno = sno;this.weight = weight;}
}

三、获取字节码信息的四种方法

package com.bones.test01;/*** @Author: Bones* @Date:2021/11/30-11-30-4:29 下午* @Description: com.bones.test01* @version: 1.0* 获取字节码信息的四种方法*/
public class Test {public static void main(String[] args) throws ClassNotFoundException {//方式1:方法getClass()  -----------不常用Person p = new Person();Class c1 = p.getClass();System.out.println(c1);//class com.bones.test01.Person//方式2:内置class属性   -----------不常用Class c2 = Person.class;System.out.println(c2);//class com.bones.test01.Person//方式3:调用Class类提供的静态方法forName   --------最常用,要加异常Class c3 = Class.forName("com.bones.test01.Person");System.out.println(c3);//class com.bones.test01.Person//方式4:类的加载器    ---------了解,技能点ClassLoader loader = Test.class.getClassLoader();Class c4 = loader.loadClass("com.bones.test01.Person");System.out.println(c4);//class com.bones.test01.Person}
}

Java反射机制01_反射的概念以及获取字节码信息 的四种方式相关推荐

  1. 查看Java字节码内容的几种方式

    1.javap 通过javac和javap查看:先通过javac将.java文件编译成.class字节码文件,然后通过javap -verbose分析字节码. (base) tinytongtongd ...

  2. java 字节码对象_获得类的字节码对象的三种方式

    java源码(xxx.java)通过编译后形成字节码文件,字节码文件通过类加载器获得字节码对象, 通过字节码对象可以操作源码中的属性和方法. 方式一,使用类的class属性: Class clazz1 ...

  3. Java 反射机制[Field反射]

    Java 反射机制[Field反射] 1.  反射概念及功能 反射就是把Java类中的各种成分映射成对应的Java类.比如一个Java类中用一个Class类的对象来表示. 一个类中的组成部分分为成员变 ...

  4. 哪些类用来实现java反射机制_JAVA反射机制

    运行时类型识别(Run-time Type Identification, RTTI)主要有两种方式,一种是我们在编译时和运行时已经知道了所有的类型,另外一种是功能强大的"反射"机 ...

  5. java反射机制_java反射机制的讲解

    一 , 什么是java反射机制? JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象 ...

  6. Java反射之创建对象的四种方式

    Java反射之创建对象的四种方式 1.使用new关键字 2.使用Java反射机制,反射构造器 3.使用克隆方式创建对象Cloneable 4.使用序列化Serializable 1.使用Java反射机 ...

  7. android利用反射调用截屏api,Android利用反射机制调用截屏方法和获取屏幕宽高的方法...

    想要在应用中进行截屏,可以直接调用 View 的 getDrawingCache 方法,但是这个方法截图的话是没有状态栏的,想要整屏截图就要自己来实现了. 还有一个方法可以调用系统隐藏的 screen ...

  8. Java 创建类的四种方式

    Java 创建类的四种方式 对于上学期已经学习过c++的同学,是不是对另一大编程语言产生了浓厚的兴趣,对于c++的面向对象编程,又和java的面向变量有何区别,下面我们从java四种创建对象来说起. ...

  9. Java中创建对象的四种方式

    为什么80%的码农都做不了架构师?>>>    Java中创建对象的四种方式 (1) 用new语句创建对象,这是最常见的创建对象的方法.    (2) 运用反射手段,调用java.l ...

最新文章

  1. a-awk 计算数值最大,最小,平均值并保留指定位数
  2. WR:城环所杨军组揭示亚热带水库浮游有壳虫群落构建受随机性过程影响比确定性过程更强...
  3. OpenCV图像金字塔pyrDown和pyrUp的实例(附完整代码)
  4. 本地编译Hadoop2.8.0源码总结和问题解决(转自:http://blog.csdn.net/young_kim1/article/details/50324345)
  5. decode encode
  6. InputStream,BufferedImage与byte数组之间的转换
  7. 前端学习(2663):vue3.0的todolist
  8. 宏基平板电脑_2020年推荐:蒲城二手笔记本电脑回收价格联想戴尔华硕上门回-老友网...
  9. 【clickhouse】clickhouse UTC 时间带有时区 如何写入
  10. Lumia 800 7.10.8783.12
  11. [转载]遗传算法介绍
  12. oracle 怎么重启数据库,oracle数据库重启
  13. 学生成绩管理系统测试用例C语言,学生成绩管理系统测试用例.docx
  14. vs登录或者添加账户时说脚本错误
  15. c++11伪随机数生成库:random
  16. unity地图路径编辑器
  17. C# Prase转换 Convert 转换
  18. Java 对一组时间进行处理 提出连续的时间段
  19. 程序员真的是吃青春饭的吗?有哪些建议可以给刚入职的程序员?(全是干货)...
  20. Unity3d:UGUI源码,Rebuild优化

热门文章

  1. Object family 在Object search中的default逻辑
  2. Netweaver是如何判断哪些对象可以被增强的
  3. 推荐一个以动画效果显示github提交记录的黑科技工具:Gource
  4. 使用JavaScript ES6的新特性计算Fibonacci(非波拉契数列)
  5. Hybris UI的Route(路由)实现
  6. OpenFOAM流固耦合问题-FsiFoam(foam-extend-4.0)运行tutorials的bug修复
  7. 介绍计算机硬件的英语作文带翻译,介绍我家的英语作文(带翻译)
  8. excel同一单元格怎么换行_Excel工作表中最经典的10个应用,小技巧,大作用
  9. 要关闭python解释器可使用函数或者快捷键_【判断题】螺旋机构具有结构简单,传动平稳,噪声低等优点,被广泛应用。...
  10. 用计算机模拟光子行为,光量子玻色—费米模拟系统的设计与实现