获取Class实例的方式与类加载器
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实例的方式与类加载器的更多相关文章
- java类加载器-系统类加载器
系统类加载器 系统类加载器可能都耳详能熟,但是为了完整点,还是先简单的说说系统的类加载器吧. public class Test { public static void main(String[] ...
- 深入探讨 Java 类加载器
转自:http://www.ibm.com/developerworks/cn/java/j-lo-classloader/ 类加载器(class loader)是 Java™中的一个很重要的概念.类 ...
- 黑马程序员_高新技术之javaBean,注解,类加载器
----------- android培训.java培训.java学习型技术博客.期待与您交流! ---------- 第一部分 javaBean 一,由内省引出javaBean 1,内省: 内省对应 ...
- 黑马程序员:Java基础总结----类加载器
黑马程序员:Java基础总结 类加载器 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 类加载器 Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个 ...
- 转载:深入探讨 Java 类加载器
转载地址 : http://www.ibm.com/developerworks/cn/java/j-lo-classloader/ 深入探讨 Java 类加载器 类加载器(class loader) ...
- java面向对象--类加载器及Class对象
类加载器 jvm 和 类的关系 当调用 java命令运行一个java程序时,会启动一个java虚拟机进程.同一个jvm的所有线程.所有变量都处于同一个进程里,都使用该jvm进程的内存区. jvm进程终 ...
- 【转】深入探讨 Java 类加载器
转自:http://www.ibm.com/developerworks/cn/java/j-lo-classloader/index.html 类加载器是 Java 语言的一个创新,也是 Java ...
- Java的类加载器
一.类加载器的概念 类加载器(class loader)用来加载 Java 类到 Java 虚拟机中.一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 ...
- 深入探讨java类加载器
概览 类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一.它使得 Java 类可以被动态加载到 Java 虚拟机中并执行.类加载器从 JDK 1.0 就出现了,最初是为了满足 ...
随机推荐
- Servlet 教程——检视阅读
Servlet 教程--检视阅读 参考 Servlet教程--菜鸟--蓝本 Servlet教程--w3cschool Servlet教程--易百 servlet依赖maven依赖: <!--se ...
- 如何找到Hive提交的SQL相对应的Yarn程序的applicationId
最近的工作是利用Hive做数据仓库的ETL转换,大致方式是将ETL转换逻辑写在一个hsql文件中,脚本当中都是简单的SQL语句,不包含判断.循环等存储过程中才有的写法,仅仅支持一些简单的变量替换,比如 ...
- Pandas切片操作:很容易忽视的SettingWithCopyWarning
Pandas是一个强大的分析结构化数据的工具集,主要用于数据挖掘和数据分析,同时也提供数据清洗功能. 很多初学者在数据的选取,修改和切片时经常面临一些困惑.这是因为Pandas提供了太多方法可以做同样 ...
- 2019-2020Nowcoder Girl初赛 题解
题目都不是很难,就是最后一题有点毒瘤 第一题:牛妹爱整除 这个你把一个进制数进行拆分,拆分成若干位,然后在取模,这样会发现如果是x进制的数,那么对x+1这个进制转化即满足条件. 举个例子:一个x进制数 ...
- C. Ilya And The Tree 树形dp 暴力
C. Ilya And The Tree 写法还是比较容易想到,但是这么暴力的写法不是那么的敢写. 就直接枚举了每一个点上面的点的所有的情况,对于这个点不放进去特判一下,然后排序去重提高效率. 注意d ...
- Spring Cloud学习 之 Spring Cloud Hystrix(使用详解)
文章目录 创建请求命令: 定义服务降级: 异常处理: 异常传播: 异常获取: 命令名称,分组以及线程池划分: 创建请求命令: Hystrix命令就是我们之前说的HystrixCommand,它用来 ...
- 面试官:小伙子,听说你看过ThreadLocal源码?(万字图文深度解析ThreadLocal)
前言 Ym8V9H.png (高清无损原图.pdf关注公众号后回复 ThreadLocal 获取,文末有公众号链接) 前几天写了一篇AQS相关的文章:我画了35张图就是为了让你深入 AQS,反响不错, ...
- Day_12【集合】扩展案例2_键盘录入一个字符串,对其进行去重,并将去重后的字符串组成新数组
需求分析:键盘读取一行输入,去掉其中重复字符, 打印出不同的那些字符 思路: 1.键盘录入字符串 2.遍历字符串,将每个字符存储到集合中 3.将集合中重复的字符去掉 4.创建新集合,遍历老集合,获取老 ...
- 【华为云技术分享】智能诊断和优化,华为云DAS服务云DBA平台让您无忧运维
摘要:随着时代的发展,传统的“人工”运维方式,已经逐渐跟不上企业业务发展的需要.如何更好的保证数据库系统的稳定性.安全性.完整性和高性能,实现运维工具化.产品化.自助化.自动化,是当前数据管理和运维面 ...
- 【Docker】在本地打包maven程序为docker镜像报错: Connect to localhost:2375 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1]
错误信息: [ERROR] Failed to execute goal com.spotify:docker-maven-plugin:1.0.0:build (default-cli) on pr ...