js java 反射机制_java 类加载机制和反射机制
一.类的加载机制
jvm把class文件加载到内存,并对数据进行校验、解析和初始化,最终形成jvm可以直接使用的java类型的过程。
(1)加载
将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区中的运行时数据结构,在堆中生成一个代表这个类的java.lang.Class对象,作为方法区类数据的访问入口。
(2)链接 将java类的二进制代码合并到jvm的运行状态之中的过程。
验证:确保加载的类信息符合jvm规范,没有安全方面的问题。
准备:正式为类变量(static变量)分配内存并设置类变量初始值的阶段,这些内存都将在方法区中进行分配。
解析:虚拟机常量池内的符号引用替换为直接引用的过程。(比如String s ="aaa",转化为 s的地址指向“aaa”的地址)
(3)初始化
初始化阶段是执行类构造器方法的过程。类构造器方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static块)中的语句合并产生的。
当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先初始化其父类的初始化
虚拟机会保证一个类的构造器方法在多线程环境中被正确加锁和同步
当访问一个java类的静态域时,只有真正声明这个静态变量的类才会被初始化。
二.java反射机制
通俗地说:反射就是将Student类中的方法、成员变量、构造方法,抽象出来可以让Class的对象单独进行访问。
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
1、获取Class对象的三种方式
(1)通过调用forName(String className),注意className的格式为:包名.类名获得Class对象。
(2)通过类获取Class对象,String.class、int.class这些字节码是Class类的对象。
(3)通过类的对象获取Class对象。
1 public static void getClass1() throwsClassNotFoundException {2 //获取Class的方法3 //正射
4 Student stu=newStudent();5 //第一种(优先选择):传的是包名.类名,通过包名和类名获得反射Class
6 Class cl1=Class.forName("day20.Student");7 //第二种:通过类来获取Class对象
8 Class cl2=Student.class;9 //第三种:通过对象获取Class对象
10 Student s=newStudent();11 Class cl3=s.getClass();12 //判断三种方法是否是同一个Class对象
13 System.out.println(cl1==cl2);14 System.out.println(cl2==cl3);15
16 }
2、获取构造方法
(1)获取公开的构造方法
(2)获取所有的构造方法
主要为调取Student类中的私有方法。注意:不能获得Student类的父类Human中的构造方法。
(3)调用特定的构造方法
无参构造和有参构造方法Constructors1.newInstance();//实例化获取的类
私有构造方法的调用,要注意要设置其访问权限Constructors1.setAccessible(true)。
1 public static void getConstruction() throwsException {2 //获取构造方法
3 Class cl=Class.forName("day20.Student");4 System.out.println("==========公开的构造方法==========");5 //获得公开的构造方法
6 Constructor[] cons=cl.getConstructors();7 for(Constructor con:cons) {8 System.out.println(con);9 }10 System.out.println("==========所有的构造方法==========");11 //获得所有的构造方法
12 Constructor[] constructors=cl.getDeclaredConstructors();13 for(Constructor con:constructors14 ) {15 System.out.println(con);16 }17 System.out.println("==========调用构造方法==========");18 //调用无参构造方法
19 Constructor constructors1=cl.getConstructor();20 Student student=(Student)constructors1.newInstance();21 //调用有参构造方法
22 Constructor constructors2=cl.getConstructor(String.class);23 Student student1=(Student) constructors2.newInstance("英语");24 //调用私有构造方法
25 Constructor constructors3=cl.getDeclaredConstructor(int.class);26 constructors3.setAccessible(true);//因为是私有化的方法,所以要设置访问权限
27 Student student2=(Student) constructors3.newInstance(2);28 }
执行结果:
==========公开的构造方法==========
public day20.Student(java.lang.String)
public day20.Student()
==========所有的构造方法==========
private day20.Student(int)
public day20.Student(java.lang.String)
public day20.Student()
==========父类的构造方法==========
无参构造方法
有参构造方法英语
私有构造方法2
3、获取方法
私有属性的调用,要注意要设置其访问权限Constructors1.setAccessible(true)。
1 private static void getMethod1() throwsException {2 Class cl=Class.forName("day20.Student");3 //获取所有公开的方法,包括Object中的类
4 Method[] method=cl.getMethods();5 for(Method m:method6 ) {7 System.out.println(m.getName());8 }9 //获取本类中所有的方法,不包括父类和eObject
10 System.out.println("==========私有方法==========");11 Method[] methods=cl.getDeclaredMethods();12 for(Method ms:methods13 ) {14 System.out.println(ms.getName());15 }16 //调取方法
17 System.out.println("==========调取特有方法==========");18 //获取非静态的无参方法
19 Method method1=cl.getMethod("eat");20 //获取Student类的成员
21 Constructor constructor=cl.getConstructor();22 Student student=(Student)constructor.newInstance();23 method1.invoke(student);24 //获取非静态含参方法
25 Method method2=cl.getMethod("study", String.class);26 method2.invoke(student,"物理");27 //获取静态无参方法
28 Method method3=cl.getMethod("sleep");29 method3.invoke(null);30 //获取静态含参方法
31 try{32 Method method4=cl.getMethod("saveMoney", double.class);33 method4.setAccessible(true);34 method4.invoke(null,100.0);35 }catch(NoSuchMethodException e){36 e.getMessage();37 }catch(Exception e){38 e.getMessage();39 }40
41 }
执行结果:
getName
setName
sleep
study
eat
setMoney
getMoney
getAge
setAge
getSex
setSex
wait
wait
wait
equals
toString
hashCode
getClass
notify
notifyAll
==========私有方法==========
getName
setName
sleep
study
eat
saveMoney
setMoney
getMoney
getAge
setAge
==========调取特有方法==========
吃饭
学习物理
睡觉
4、获取属性
1 private static void getAttribute1() throwsException{2 Class cl=Class.forName("day20.Student");3 //获取所有属性
4 Field[] fields=cl.getFields();5 for(Field field:fields6 ) {7 System.out.println("属性值有:"+field.getName());8 }9 //获取私有化属性
10 Field field=cl.getDeclaredField("money");11 field.setAccessible(true);12 //获取Student类的成员
13 Constructor constructor=cl.getConstructor();14 Student student=(Student)constructor.newInstance();15 student.setMoney(100);16 System.out.println("通过对象.方法进行属性赋值:"+student.getMoney());17 field.set(student,200);18 System.out.println("通过Field对象.方法进行赋值:"+student.getMoney());19 }
执行结果:
属性值有:name
通过对象.方法进行属性赋值:100.0
通过Field对象.方法进行赋值:200.0
Student类和父类
1 packageday20;2
3 public class Student extendsHuman{4 publicString name;5 intage;6 private doublemoney;7
8 publicStudent() {9 System.out.println("无参构造方法");10 }11 publicStudent(String subject) {12 System.out.println("有参构造方法"+subject);13 }14
15 private Student(inti) {16 System.out.println("私有构造方法"+i);17 }18 publicString getName() {19 returnname;20 }21 public voidsetName(String name) {22 this.name =name;23 }24 public intgetAge() {25 returnage;26 }27 public void setAge(intage) {28 this.age =age;29 }30 public doublegetMoney() {31 returnmoney;32 }33 public void setMoney(doublemoney) {34 this.money =money;35 }36
37 public voideat(){38 System.out.println("吃饭");39 }40
41 public voidstudy(String subject){42 System.out.println("学习"+subject);43 }44
45 public static voidsleep(){46 System.out.println("睡觉");47 }48
49 private static void saveMoney(doublemoney){50 System.out.println("存款"+money);51 }52 }53
54
55 packageday20;56
57 public classHuman {58 privateString sex;59 publicHuman(){60
61 }62
63 private Human(inti){64
65 }66
67 publicString getSex() {68 returnsex;69 }70
71 public voidsetSex(String sex) {72 this.sex =sex;73 }74 }
js java 反射机制_java 类加载机制和反射机制相关推荐
- java sleep唤醒_Java中的等待唤醒机制—至少50%的工程师还没掌握!
Java中的等待唤醒机制-至少50%的工程师还没掌握! 发布时间:2019-12-14 01:53, 浏览次数:222 , 标签: Java 这是一篇走心的填坑笔记,自学Java的几年总是在不断学习新 ...
- java gc回收机制_Java中的GC回收机制
为什么要进行GC回收? 当我们新建一个对象时,系统就会为其分配一定的内存空间,而有时候新建的对象没有去使用时,不回收的话会极大浪费内存空间,造成系统效率低下. 什么时候进行GC回收? 1.当CPU空闲 ...
- java心跳机制_Java: server/client 心跳机制实现 示例
心跳机制 心跳机制是定时发送一个自定义的结构体(心跳包),让对方知道自己还活着,以确保连接的有效性的机制. 大部分CS的应用需要心跳机制.心跳机制一般在Server和Client都要实现,两者实现原理 ...
- 类java的步骤_java类加载的过程
类加载就是三个过程:加载.链接.初始化 链接又可以分为验证.准备.解析 1.加载 将class字节码文件通过类加载器装入内存中 2.验证 确保当前class文件的字节流所包含的内容符合当前JVM的规范 ...
- 反射 字段_java核心基础之反射
前言 大家好,我是 jack xu,今天跟大家介绍核心基础里面的反射,反射这个东西你说它重要也重要,不重要也不重要.重要是当你看一些框架的源码时候,里面会用到反射的代码,你不会是看不懂的.不重要是因为 ...
- java 反射.问题_Java知识点总结(反射-反射机制性能问题)
Java知识点总结(反射-反射机制性能问题) @(Java知识点总结)[Java, 反射] 性能相关注意点: setAccessible 启用和禁用访问安全检查的开关,值为 true 则指示反射的对象 ...
- java 不可变性_JAVA不可变类(immutable)机制与String的不可变性(推荐)
一.不可变类简介 不可变类:所谓的不可变类是指这个类的实例一旦创建完成后,就不能改变其成员变量值.如JDK内部自带的很多不可变类:Interger.Long和String等. 可变类:相对于不可变类, ...
- java 鸭子类_Java中实现鸭子类型机制
"当看到一只鸟走起来像鸭子.游泳起来像鸭子.叫起来也像鸭子,那么这只鸟就可以被称为鸭子."[引用维基] 一般而言,鸭子类型机制常见/用于动态语言,如Python.Ruby.JS.来 ...
- java gc内存_Java内存模型和GC机制
最近学习Python的GC机制时,想到了java的GC,忘得差不多了,(⊙﹏⊙)b!!这里便做一下回顾总结.推荐周志明译本的<深入理解Java虚拟机>. 1. Java内存模型 1.1 程 ...
最新文章
- 219. Contains Duplicate II
- java开发和测试开发,附小技巧
- Canvas的save和restore方法
- HDU多校2 - 6763 Total Eclipse(贪心+并查集)
- P6688-可重集【字符串hash,线段树】
- 为什么linux的新得立软件下载,linux,debian_蝶变(Debian)_Xfce_新立得软件管理_安装不上软件了,怎么处理?,linux,debian - phpStudy...
- 学之思开源考试系统 - 使用手册
- Python实现带有阻塞和超时放弃功能的队列结构
- 哈希表(散列表)冲突解决方法
- 容器镜像相关项目 错误 分析步骤
- 高亮插件Highlighting的使用
- 敏捷开发scrum详解 敏捷项目管理流程
- 四足机器人(一)----MATLAB simulink对四足机器人物理建模
- FMDB與SQLite 數據庫應用示範:打做一隻簡單的電影資料庫 App
- 关于Oracle数据库的笔记
- jmeter性能测试脚本录制不了的几种情况
- 计算机与电视连接方式是什么,电脑投屏到电视机怎么设置(详解两者间的投屏方法)...
- c++也能做动图?——devc++窗口做简单移动
- 鼠标连点+键盘连按+键盘鼠标录制精灵独立版
- 病毒周报(081117至081123)
热门文章
- AI 安全在阿里业务中的实践,你了解吗?
- 【杭州云栖】边缘计算ENS:拓展云的边界
- 我需要一个高并发的架构,我的系统要改造成微服务吗
- K8S精华问答 | CentOS下如何配置主机互信?
- 云生态战略首次曝光,牵手精诚中国和神州光大共建云生态
- 用计算机算小学题目,小学计算机入编考试考试试题.doc
- android read设置超时时间,在Android中的BluetoothSocket inputstream.read()中实现超时
- 字符串反转python_Python实现字符串反转的几种方法
- oracle解决存储嗅探,DBA警示录:存储故障的处理应当谨慎
- 通用mapper 如何处理多表条件查询通过list封装(一对多)