1. 类加载器

我们程序猿编写的是java文件,编译之后就是class文件,但并不是编译完成之后就能用了,具体的使用,得加载到虚拟机中运行,那么从硬盘到虚拟机内存中的这个步骤,就会使用到这边的类加载器!

1.1 类加载时机

一句话概括就是你用到的时候,他才会把class文件放入内存。那具体是什么时机呢?

  1. 你new 一个对象的时候
  2. 调用静态方法或者调用静态变量,也就是当你用类名直接点方法,或者点具体的变量的时候。
  3. 反射,强制创建一个对象。
  4. 创建子类的时候,父类也会被创建
  5. 通过java.exe 运行某个类的时候

1.2 类加载过程

1.3 类加载器种类

了解一下就好分别是启动类加载器、平台类加载器、系统类加载器、除此之外我们这也可以自定义加载器,而我们用的最多的其实就是这个系统类加载器。这些加载器能加载的范围不一样。

代码看一下,比较特殊的就是启动类是null,null就是他的地址。这边还有个方法就是通过类加载器去加载文件,注意这个文件是在src目录下的。

 public static void main(String[] args) throws IOException {//系统类加载器ClassLoader classloader1 =  ClassLoader.getSystemClassLoader();//平台类加载器ClassLoader parent = classloader1.getParent();//启动类加载器ClassLoader parent1 = parent.getParent();System.out.println(classloader1);System.out.println(parent);System.out.println(parent1);InputStream resourceAsStream = classloader1.getResourceAsStream("test.properties");Properties pp = new Properties();pp.load(resourceAsStream);System.out.println(pp);resourceAsStream.close();}

2. 反射

我直接形容一下使用到反射的场景,我们一般创建对象都是通过new ,但试想一种场景,我编写好了100个类,我现在还没想好运行哪一个类的哪一个方法,怎么办?我编写代码的时候我也不知道我会用到具体哪个类,具体哪个方法。那么这个时候就需要用到动态配置,到时候运行的时候我改一下配置文件,我想运行哪个类就运行哪个类,想用哪个方法用哪个方法岂不美哉?反射就可以实现。下面代码见。

2.1 获取class 对象(3种方式)

public static void main(String[] args) throws ClassNotFoundException {//第一种方式Class<?> aClass = Class.forName("com.yxlm.dmxy.Yasuo");//第二种方式Class<Yasuo> aClass1 = Yasuo.class;//第三种方式Yasuo yasuo = new Yasuo();Class<? extends Yasuo> aClass2 = yasuo.getClass();//这边注意一下 aClass==aClass1==aClass2 这三个都是相等的}

2.2 获取类的属性

一个class有三大属性,field 是成员变量,construct是构造方法,method 是成员方法。

2.2.1 获取构造方法

 public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {//第一种方式Class<?> aClass = Class.forName("com.yxlm.dmxy.Yasuo");//获取所有公有的构造方法 public 修饰的Constructor<?>[] constructors = aClass.getConstructors();for (Constructor constructor : constructors) {System.out.println("getConstructors"+constructor);}//获取所有构造方法Constructor<?>[] constructorsAll = aClass.getDeclaredConstructors();for (Constructor constructor : constructorsAll) {System.out.println("getDeclaredConstructors"+constructor);}//根据入参返回具体构造方法,这边的入参数是class,获取的只能公有的私有的获取不到//返回的是public Yasuo()Constructor<?> constructor = aClass.getConstructor();System.out.println("获取无参构造" + constructor);//private Yasuo(int age) 获取私有的只能是这个方法,当然也可以获取公有的Constructor<?> constructor2 = aClass.getDeclaredConstructor(int.class);System.out.println("获取无参构造1" + constructor2);}

2.2.2 反射创建对象

 public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {//第一种方式Class<?> aClass = Class.forName("com.yxlm.dmxy.Yasuo");//反射创建对象,这边等于new,当然无参构造也是一样的道理Constructor<?> constructor = aClass.getConstructor(int.class, String.class);Yasuo hasaki = (Yasuo) constructor.newInstance(23, "hasaki");System.out.println(hasaki);//这边构造有新的方法,了解一下就行Yasuo o1 = (Yasuo) aClass.newInstance();//获取私有构造方法,需要强制访问,暴力反射!!!!Constructor<?> constructor1 = aClass.getDeclaredConstructor(int.class);//强制访问私有方法constructor1.setAccessible(true);Yasuo o = (Yasuo) constructor1.newInstance(122);}

2.2.3 获取所有成员变量

public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchFieldException {//第一种方式Class<?> aClass = Class.forName("com.yxlm.dmxy.Yasuo");//反射获取成员变量,publicField[] fields = aClass.getFields();for (Field field : fields) {System.out.println("获取所有公共的成员方法"+field);}//获取所有Field[] fieldsAll = aClass.getDeclaredFields();for (Field field : fieldsAll) {System.out.println("所有"+field);}//获取单个公有的,同理获取私有的就不演示了Field nickname = aClass.getField("nickname");System.out.println("单个"+nickname);}

2.2.4 get&set

public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchFieldException {//第一种方式Class<?> aClass = Class.forName("com.yxlm.dmxy.Yasuo");Yasuo o = (Yasuo) aClass.newInstance();Field msg = aClass.getDeclaredField("r");msg.set(o,"hasaihasaihasai");System.out.println(o);//有的小伙伴就要问了直接//o.setAge();多方便,但是这个方法是可以在没有set方法的时候给变量赋值Field nickname = aClass.getDeclaredField("nickname");String o1 = (String) nickname.get(o);System.out.println(o1);}

2.2.5 获取成员方法

public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchFieldException {//第一种方式Class<?> aClass = Class.forName("com.yxlm.dmxy.Yasuo");//获取所有方法,这个会返回父类的所有方法,不包括私有方法Method[] methods = aClass.getMethods();for (Method method : methods) {System.out.println("所有方法"+method);}//获取自己的成员方法,包含自己的私有方法Method[] methodsSelf = aClass.getDeclaredMethods();for (Method method : methodsSelf) {System.out.println("自己的方法"+method);}//获取单个方法Method getAge = aClass.getMethod("getAge");System.out.println("单个"+getAge);//获取有参数的方法Method setAge = aClass.getMethod("setAge", int.class);System.out.println("单个setAge"+setAge);//获取私有的方法Method kill = aClass.getDeclaredMethod("kill");System.out.println("kill"+kill);}

2.2.6 使用方法 invoke

public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchFieldException {//第一种方式Class<?> aClass = Class.forName("com.yxlm.dmxy.Yasuo");Method kill = aClass.getDeclaredMethod("kill");Constructor<?> constructor = aClass.getConstructor(int.class, String.class);kill.setAccessible(true);kill.invoke(constructor.newInstance(1,"haihaihai!!!"));}

Java 类加载器、反射相关推荐

  1. 深入探讨 Java 类加载器

    深入探讨 Java 类加载器 类加载器(class loader)是 Java™中的一个很重要的概念.类加载器负责加载 Java 类的字节代码到 Java 虚拟机中.本文首先详细介绍了 Java 类加 ...

  2. Java类加载器总结

    转载自  Java类加载器总结 1.类的加载过程   JVM将类加载过程分为三个步骤:装载(Load),链接(Link)和初始化(Initialize)链接又分为三个步骤,如下图所示: 1) 装载:查 ...

  3. Java类加载器及自定义类加载器

    一.类加载器父亲委托机制 Java类加载器采用父亲委托机制,先尝试用父加载器加载,父加载器无法加载,则此加载器加载, 注意,此父加载器与子加载器并非继承关系,而是指定的关系. 从ClassLoader ...

  4. 80070583类不存在_结合JVM源码谈Java类加载器

    一.前言 之前文章 加多:ClassLoader解惑​zhuanlan.zhihu.com 从Java层面讲解了Java类加载器的原理,这里我们结合JVM源码在稍微深入讲解下. 二.Java类加载器的 ...

  5. java类加载器_类加载器

    回顾一下类加载过程 类加载过程:加载->连接->初始化.连接过程又可分为三步:验证->准备->解析. 一个非数组类的加载阶段(加载阶段获取类的二进制字节流的动作)是可控性最强的 ...

  6. java 类加载器 解密_JAVA类加载器总结整理

    一.What(是什么?) 1.概念 Java类加载器是Java运行时环境的一部分,负责动态加载Java类到JVM的内存空间中.每个Java类必须由某个类加载器装入到内存中.每一个类加载器都有一个父类加 ...

  7. java 调用scala 类_如何使用java类加载器调用带参数的scala函数?

    我正在寻找一些将scala jar加载到java类加载器的指导. 当我使用java jar文件时,下面的函数对我有效. 其中,arr是一个java.net.URL数组,用于我需要加载到类加载器中的所有 ...

  8. Java类加载器( 死磕9)

    [正文]Java类加载器(  CLassLoader ) 死磕9:  上下文加载器原理和案例 本小节目录 9.1. 父加载器不能访问子加载器的类 9.2. 一个宠物工厂接口 9.3. 一个宠物工厂管理 ...

  9. java 类加载器-基础

    java 类加载器-基础 类加载机制 类加载器的双亲委托机制 自定义类加载路径 自定义类加载器 类加载机制 类加载器ClassLoader. – 负责查找,加载,校验字节码的应用程序. – java. ...

  10. 【java】 Java 类加载器 破坏双亲委派

    1.概述 深入探讨 Java 类加载器 Java双亲委派模型:为什么要双亲委派?如何打破它?破在哪里? Java中的双亲委派机制以及如何打破

最新文章

  1. SQL判断NULL的几种常见方式
  2. 模块化 组件化 工程化_软件工程中的模块和软件组件
  3. sed、head、grep、tail、EOF
  4. mysql star item 失败_解决CentOS7下MySQL服务启动失败的问题.md
  5. ssma5.3_使用SSMA v7.1 for Oracle迁移到SQL Server
  6. DEV MessageBox
  7. 透过用户思维谈程序员的进阶之路
  8. C# 获取Newtonsoft.Json的JObject多层节点内容
  9. maven:pom文件详解
  10. 打印机驱动兼容问题导致打印乱码
  11. XML中输入特殊符号
  12. IDEA高级使用教程
  13. win10服务器修改远程密码,win10系统远程桌面保存密码后无法修改的解决方案...
  14. php只取时间的下士_php取当时的年月日时分秒毫秒
  15. Python AI 换脸,宋小宝都能换脸刘亦菲,你的网恋对象不知道有多可怕!
  16. php 图片生成视频,PHP基于ffmpeg实现转换视频,截图及生成缩略图的方法
  17. Python正则表达式re库
  18. 瓦伦达心态是什么瓦伦达心态在投资中应用
  19. Python的函数大全
  20. 机器学习笔记5-Tensorflow高级API之tf.estimator

热门文章

  1. 证明ker f是H中的闭线性子空间(f是连续有界线性泛函)
  2. python笔记手册_《Python 学习手册》读书笔记
  3. 智慧食堂到底如何运营?学校食堂必看
  4. 安全研究人员发现新的Android恶意软件:已感染1000多万部安卓手机
  5. 外国男子在北京抢车后连撞4车和1名行人-砍伤-外国男子-菜刀
  6. 《云计算核心技术剖析》迷你书连载三 – 云计算的商业模式
  7. CSS中font-family属性值中文和英文的问题
  8. 将一元人民币兑换成1分、2分、5分,有几种兑换办法?
  9. 盘点NBA历史上最强球员前十排行榜:沙奎尔·奥尼尔
  10. 串的一些基础操作(c语言)~DS笔记⑤