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. thinkphp历史漏洞

    https://github.com/pochubs/pochubs/blob/master/ThinkPHP.md tp 历史漏洞 路由控制類RCE/think/App.php if (!preg_ ...

  2. C. The Big Race

    \(给出数n,a,b\) \(在[1,n]区间内随机选数,选出的数被a,b除后同余的概率\) \(这题的精度问题真的是烦炸了~\) \(设最小公倍数lcm=a*b/gcd(a,b)\) \(所以在区间 ...

  3. 基本Linux命令(上)

           Linux的难点在于我们需要记忆大量的命令及参数.如有问题请批评指正,在下感激不尽.        Linux的命令都是在shell下使用的,也就是我们常说的终端(Terminal).包 ...

  4. MySQL(二)MySQL中的存储引擎

    前言 数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建.查询.更新和删除数据.不同的存储引擎提供不同的存储机制.索引技巧.锁定水平等功能,使用不同的存储引擎,还可以 ...

  5. 操作系统实验——PV操作实现生产者消费者模型

    操作系统PV操作之--生产者消费者模型 个人博客主页 参考资料: Java实现PV操作 | 生产者与消费者 浙大公开课 在操作系统的多进程.多线程操作中经常会有因为同步.互斥等等问题引发出的一系列问题 ...

  6. 【HBase】快速了解上手rowKey的设计技巧

    目录 为什么要设计rowKey 三大原则 长度原则 散列原则 唯一原则 热点问题的解决 加盐 哈希 反转 时间戳反转 为什么要设计rowKey 首先要弄明白一点,Regions的分区就是根据数据的ro ...

  7. 【FreeRTOS学习05】深度解剖FreeRTOSConfig.h实现对系统的自定义剪裁

    ROM/RAM太小,因此要对系统进行剪裁: 相关文章 [FreeRTOS实战汇总]小白博主的RTOS学习实战快速进阶之路(持续更新) 文章目录 相关文章 1 系统的剪裁 2 FreeRTOSConfi ...

  8. Struts2-Tiles 2.5.2 升级指南和通配符拓展

    最近工程从Struts2.3.18升级Struts2.5.2导致相关联的插件都需要升级到相同版本,其中tiles的变化最大. 1.web.xml上 listener org.apache.struts ...

  9. 挺好用的socks5库go-socks5

    1.挺好用的socks5库 github.com/armon/go-socks5 2.示例代码 // Create a SOCKS5 server conf := &socks5.Config ...

  10. spark机器学习从0到1基本数据类型之(二)

        MLlib支持存储在单个机器上的局部向量和矩阵,以及由一个或多个RDD支持的分布式矩阵. 局部向量和局部矩阵是用作公共接口的简单数据模型. 底层线性代数操作由Breeze提供. 在监督学习中使 ...