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. Nmon 的安装及使用

    一.安装 Nmon 1.下载地址:http://nmon.sourceforge.net/pmwiki.php?n=Site.Download 2.下载对应系统的 nomn 工具(我用 centos6 ...

  2. 【Spark】通过SparkStreaming实现从socket接受数据,并进行简单的单词计数

    文章目录 步骤 一.创建maven工程并导入jar包 二.安装并启动生产者 三.开发SparkStreaming代码 四.查看结果 步骤 一.创建maven工程并导入jar包 <properti ...

  3. Leetcode_45. 跳跃游戏 II

    每个位置i有一个最大跳跃距离,求最小步数从0跳到n-1. dp[i]表示从0跳到i的最少步数,显然可以转移的状态就是从i-a[i]到i-1. 因为是最小步数,考虑用优先队列优化,再考虑到状态有范围的, ...

  4. Spring DI使用详解

    Spring DI使用详解 一.介绍 DI的定义:依赖注入,为类里面的属性设值.例如,我们之前的setName方法就是在为name属性设值. IOC与DI的关系:IOC进行对象的创建,DI进行值的注入 ...

  5. An SWT error has occurred

    对话框标题:Problem Occurred 对话框内容:Unhandled event loop exception No more handles 对话框按钮:第一个超链接:Show Error ...

  6. neo4j 图数据库安装及介绍

    neo4j 图数据库安装及介绍 一.neo4j图数据库介绍 图数据库,顾名思义就是利用了"图的数据结构来作为数据存储逻辑体现的一种数据库",所以要想学好图数据库当然需要了解一些关于 ...

  7. 简单的Java实现Netty进行通信

    使用Java搭建一个简单的Netty通信例子 看过dubbo源码的同学应该都清楚,使用dubbo协议的底层通信是使用的netty进行交互,而最近看了dubbo的Netty部分后,自己写了个简单的Net ...

  8. C# 数据操作系列 - 7. EF Core 导航属性配置

    在上一篇,大概介绍了Entity Framework Core关于关系映射的逻辑.在上一篇中留下了EF的外键映射没有说,也就是一对一,一对多,多对一,多对多的关系等.这一篇将为大家细细分析一下,如何设 ...

  9. 如何通过VMware安装Linux CentOS 7.7系统

    如何在Vmware安装Linux CentOS 7.7系统,并且是最小化安装.之后进行必要的配置修改,并实现基础优化.最后做一个快照. 安装Linux CentOS 7.7 安装要求:安装后的虚拟机用 ...

  10. Python中的时间与日期

    本文简要介绍datetime,time模块的简要用法. datetime模块 datetime模块主要有四个主要的对象. date 处理年.月.日 time处理时.分.秒.微秒 datetime处理日 ...