1. java.lang.Class:   是反射的源头

2.如何获取Class的实例(3种)

3.关于类的加载器

TestReflection2

package com.aff.reflection;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties; import org.junit.Test;
/*
java.lang.Class: 是反射的源头
我们创建一个类,通过编译(javac.exe),生辰对应的.class文件。
之后我们使用java.exe加载(JVM的类的加载器)此class文件,
.class文件加载到内存后,就是一个运行时类,存在缓存区中。
那么运行时类本身就是一个Class的实例
1.每一个运行时类只加载一次
2.有了Class实例以后,才能进行如下的操作
①创建运行时类的对象
②可以获取对应的运行时类的完整结构(属性,方法,构造器,内部类。。。)
③调用对应的运行时类的指定的结构(属性,方法,构造器)
④反射的动态代理
*/ public class TestReflection2 {
// 关于类的加载器
@Test
public void test5() throws IOException, ClassNotFoundException {
ClassLoader loader1 = ClassLoader.getSystemClassLoader();
System.out.println(loader1);// sun.misc.Launcher$AppClassLoader@7852e922 ClassLoader loader2 = loader1.getParent();
System.out.println(loader2);// sun.misc.Launcher$ExtClassLoader@330bedb4 ClassLoader loader3 = loader2.getParent();
System.out.println(loader3);// null // 自定义的类是由系统加载器加载的
Class clazz = Person.class;
ClassLoader loader4 = clazz.getClassLoader();
System.out.println(loader4);// sun.misc.Launcher$AppClassLoader@7852e922 // String,Object又由上面的引导类加载的,所有加载不到的
String className = "java.lang.String";
Class clazz2 = Class.forName(className);
ClassLoader loader5 = clazz2.getClassLoader();
System.out.println(loader5);// null // 掌握如下:
//法一:指定目录下的jdbc.properties,可具体的包里
ClassLoader loader = this.getClass().getClassLoader();
InputStream is = loader.getResourceAsStream("com\\aff\\reflection\\jdbc.properties");
//法二:当前工程下jdbc.properties
//FileInputStream is = new FileInputStream(new File("jdbc.properties")); Properties pros = new Properties();
pros.load(is);
String name = pros.getProperty("user");
String password = pros.getProperty("password");
System.out.println(name + "\n" + password);//root \n 123abc } // 如何获取Class的实例(3种)
@Test
public void test4() throws ClassNotFoundException {
// 1.调用运行时类本身的 .class
Class clazz1 = Person.class;
System.out.println(clazz1);// class com.aff.reflection.Person
System.out.println(clazz1.getName());// class com.aff.reflection.Person
Class clazz2 = String.class;
System.out.println(clazz2.getName());// java.lang.String // 2.通过运行时类的对象获取
Person p = new Person();
Class clazz3 = p.getClass();
System.out.println(clazz3.getName());// com.aff.reflection.Person // 3.通过Class的静态方法获取,t通过此方式,体会,反射的动态性
String className = "com.aff.reflection.Person";
Class clazz4 = Class.forName(className);
// clazz4.newInstance();//可以操作很多事
System.out.println(clazz4.getName());// com.aff.reflection.Person // 4.通过类的加载器(了解)
ClassLoader classloader = this.getClass().getClassLoader();// 得到类加载器
Class clazz5 = classloader.loadClass(className);//
System.out.println(clazz5);// class com.aff.reflection.Person
} @Test
public void test3() {
Person p = new Person();
Class clazz = p.getClass();
System.out.println(clazz);// class com.aff.reflection.Person
}
}

3.关于类的加载器

类加载器是用来把类(class)装载进内存的。

JVM 规范定义了两种类型的类加载器:启动类加载器(bootstrap)和用户自定义加载器(user-defined class loader)。

JVM在运行时会产生3个类加载器组成的初始化加载器层次结构 ,如下图所示:

获取Class实例的方式与类加载器的更多相关文章

  1. java类加载器-系统类加载器

    系统类加载器 系统类加载器可能都耳详能熟,但是为了完整点,还是先简单的说说系统的类加载器吧. public class Test { public static void main(String[] ...

  2. 深入探讨 Java 类加载器

    转自:http://www.ibm.com/developerworks/cn/java/j-lo-classloader/ 类加载器(class loader)是 Java™中的一个很重要的概念.类 ...

  3. 黑马程序员_高新技术之javaBean,注解,类加载器

    ----------- android培训.java培训.java学习型技术博客.期待与您交流! ---------- 第一部分 javaBean 一,由内省引出javaBean 1,内省: 内省对应 ...

  4. 黑马程序员:Java基础总结----类加载器

    黑马程序员:Java基础总结 类加载器   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 类加载器 Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个 ...

  5. 转载:深入探讨 Java 类加载器

    转载地址 : http://www.ibm.com/developerworks/cn/java/j-lo-classloader/ 深入探讨 Java 类加载器 类加载器(class loader) ...

  6. java面向对象--类加载器及Class对象

    类加载器 jvm 和 类的关系 当调用 java命令运行一个java程序时,会启动一个java虚拟机进程.同一个jvm的所有线程.所有变量都处于同一个进程里,都使用该jvm进程的内存区. jvm进程终 ...

  7. 【转】深入探讨 Java 类加载器

    转自:http://www.ibm.com/developerworks/cn/java/j-lo-classloader/index.html 类加载器是 Java 语言的一个创新,也是 Java ...

  8. Java的类加载器

    一.类加载器的概念 类加载器(class loader)用来加载 Java 类到 Java 虚拟机中.一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 ...

  9. 深入探讨java类加载器

    概览 类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一.它使得 Java 类可以被动态加载到 Java 虚拟机中并执行.类加载器从 JDK 1.0 就出现了,最初是为了满足 ...

随机推荐

  1. redis 6.0下redis-cluster-proxy代理尝试

    伴随着Redis6.0的发布,作为最令人怦然心动的特性之一,Redis官方同时推出Redis集群的proxy了:redis-cluster-proxy,https://github.com/Redis ...

  2. spring源码阅读笔记10:bean生命周期

    前面的文章主要集中在分析Spring IOC容器部分的原理,这部分的核心逻辑是和bean创建及管理相关,对于单例bean的管理,从创建好到缓存起来再到销毁,其是有一个完整的生命周期,并且Spring也 ...

  3. 基于3D NAND层差异的固态盘请求调度算法研究立项 报告

    Abstract SSD(Solid State Drive),因其超高的读写性能,以及价格的走低趋势逐渐占据市场,为人们带来更好的用户体验,也为企业级的高并行业务需要提供了一定支持,近几年来SSD的 ...

  4. 【BIM】BIMFACE中实现电梯实时动效

    背景 在运维场景中,电梯作为运维环节重要的一部分是不可获缺的,如果能够在三维场景中,将逼真的电梯效果,包括外观.运行状态等表现出来,无疑是产品的一大亮点.本文将从无到有介绍如何在bimface中实现逼 ...

  5. node常用插件使用

    1.nodemon 用于热更新,随时监控文件的变化 安装npm i -g nodemon 使用nodemon index.js 2.nvm nvm用于nodejs版本管理,我们在开发过程中,不同的项目 ...

  6. docker-compose安装rabbitmq集群(主从集群---》镜像集群)

    docker-compose安装rabbitmq集群(主从集群--->镜像集群) yls 2020/5/11 创建docker-compose.yml 文件 version: '3' servi ...

  7. Istio的流量管理(概念)(istio 系列二)

    Istio的流量管理(概念) 目录 Istio的流量管理(概念) 概述 Virtual services 为什么使用virtual service Virtual services举例 hosts字段 ...

  8. Power BI Desktop心得

    我是用钉钉邮箱做账号登录Power BI Desktop的.我用Power BI Desktop,做排版和统计. Power BI由Power Query和Power Pivot组成,前者有M语言,后 ...

  9. [hdu5445 Food Problem]多重背包

    题意:一堆食物,有价值.空间.数量三种属性,一些卡车,有空间,价格,数量三种属性.求最少的钱(不超过50000)买卡车装下价值大于等于给定价值的食物,食物可以拆开来放. 思路:这题的关键是给定的条件: ...

  10. 自动配置的Springboot内junit测试单元不能运行

    解决测试单元不能运行 问题:测试单元的 @Test 前面没有运行图标 解决 IDEA内:File - Setting - Plugins:搜到JUnitGenerator2.0,安装,重启IDEA 光 ...