Class类和ClassLoader类的简单介绍
- 反射机制中的Class
- Class内部到底有什么呢?看下图!
- 代码:
Class cls=Person.class;- 1、Class类:
- 1、 对象照镜子后可以得到的信息:某个类的数据成员名,方法和构造器、某个类到底实现了
- 哪些接口。对于每个类而言,JRE都为其保留一个不变的Class类型的对象。一个Class对象包含可特定的某个类的有关信息。
- 2、Class对象只能由系统建立对象。
- 3、一个类在JVM中只会有一个Class实例。
- 4、每个类的实例都会记得自己是由哪个Class实例产生的。
- 5、Class本质上就是一个类!是一个用来描述指定类本身内部信息的一个类!
- 2、得到Class对象【三种方法】
- 1、直接通过: 类名.class
- Class cls=Person.class;
- 2、getClass()方式
- Object obj=new Person();
- Class cls2=obj.getClass();
- 3、Class.forName("包名.类名")【最常用】【框架使用的最多】
- try {
- Class cls3=Class.forName("cn.sgg.reflections.Person");
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }
- 3、反射中的泛型
- 举例:
- Class<Person> cls3=(Class<Person>) Class.forName("cn.sgg.reflections.Person");
- Class<?> cls3=(Class<Person>) Class.forName("cn.sgg.reflections.Person");
- //?表示任意对象类型
- 4、Class类中的方法
- 1、创建类的实例的方法:newInstance()
- Class cls3=Class.forName("cn.sgg.reflections.Person");
- Object obj=cls3.newInstance();//得到实例(通过:无参构造器)
- Object obj=cls3.newInstance(new Class[]{String.class,int.class});//得到实例(通过:有参构造器)
- 说明:一般来说,一个类若声明了无参构造器,也要声明一个有参构造器!(有参的是留给反射用的!)
- 2、Field<------>classType.getDeclaredFields();
- 3、Method<----->getDeclaredMethod(getMethodName, new Class[]{});
- 4、Constructor<------>getConstructor(new Class[]{int.class,String.class});
- 5、反射的在哪里被使用?
- 框架中:
Servlet、Strust2等基础框架中......- 6、类加载器:ClassLoader
- 说明:
- ClassLoader:类加载器是用来把类(class)装进JVM的。JVM规范定义了两种类型的类装载器。
- 启动类装载器(bootstap)
- 用户自定义装载器(user-defined class loader)。
- JVM在运行时会产生3个类加载器组成的初始化加载器层次结构,
- 如下图:
- BootStrap(启动类加载器) :负责加载 jdk.../jre/lib/xxx.jar (例如:rt.jar)或者被 -Xbootclasspath参数指定的路径的jar
extension classloader(扩展类加载器) 加载 jdk.../jre/lib/ext/xxx.jar 或者 java.ext.dirs指定的路径的类库
system(application) classloader(应用程序加载器或者系统类加载器): 负责加载用户类路径(ClassPath)上指定的类库。
例如查看javac的帮助信息:
- C:\Users\liqiang\Desktop>javac
- 用法: javac <options> <source files>
- 其中, 可能的选项包括:
- -g 生成所有调试信息
- -g:none 不生成任何调试信息
- -g:{lines,vars,source} 只生成某些调试信息
- -nowarn 不生成任何警告
- -verbose 输出有关编译器正在执行的操作的消息
- -deprecation 输出使用已过时的 API 的源位置
- -classpath <路径> 指定查找用户类文件和注释处理程序的位置
- -cp <路径> 指定查找用户类文件和注释处理程序的位置
- -sourcepath <路径> 指定查找输入源文件的位置
- -bootclasspath <路径> 覆盖引导类文件的位置
- -extdirs <目录> 覆盖所安装扩展的位置
- -endorseddirs <目录> 覆盖签名的标准路径的位置
- -proc:{none,only} 控制是否执行注释处理和/或编译。
- -processor <class1>[,<class2>,<class3>...] 要运行的注释处理程序的名称; 绕过默认
- -processorpath <路径> 指定查找注释处理程序的位置
- -d <目录> 指定放置生成的类文件的位置
- -s <目录> 指定放置生成的源文件的位置
- -implicit:{none,class} 指定是否为隐式引用文件生成类文件
- -encoding <编码> 指定源文件使用的字符编码
- -source <发行版> 提供与指定发行版的源兼容性
- -target <发行版> 生成特定 VM 版本的类文件
- -version 版本信息
- -help 输出标准选项的提要
- -A关键字[=值] 传递给注释处理程序的选项
- -X 输出非标准选项的提要
- -J<标记> 直接将 <标记> 传递给运行时系统
- -Werror 出现警告时终止编译
- @<文件名> 从文件读取选项和文件名
- 举例:
- 1、//获取一个系统类加载器
- ClassLoader classLoader=ClassLoader.getSystemClassLoader();
- System.out.println(classLoader);
- 2、//获取一个系统类加载器
- ClassLoader classLoader=ClassLoader.getSystemClassLoader();
- System.out.println("系统加载器:"+classLoader);
- 3、//获取系统类加载器的父类的加载器
- ClassLoader parentLoader=classLoader.getParent();
- System.out.println("系统加载器的父类加载器:"+classLoader);
- 4、//获取扩展类加载器的父类加载器
- classLoader=parentLoader.getParent();
- System.out.println("扩展类加载器的父类加载器:"+classLoader);
- 5、//检测当前类是由哪个类加载器加载的
- try {
- ClassLoader classLoader2=Class.forName("cn.sgg.reflections.TestReflect").getClassLoader();
- System.out.println(classLoader2);
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }
- 6、//检测JDK 提供的Object类由哪个类加载器负责加载的
- ClassLoader classLoader3;
- try {
- classLoader3 = Class.forName("java.lang.Object").getClassLoader();
- System.out.println(classLoader3);
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }
- 7、关于类加载器的一个重要方法:
- 系统类加载器可以加载本项目下的所有的对应的class文件和其他文件!/bin/xxx.文件后缀
- 举例:
- //关于类加载器的一个重要方法:
- InputStream in=TestReflect.class.getResourceAsStream("xxxx.txt");
测试代码:
- package cn.sgg.reflections;
- /**
- * 反射--被测试类:
- */
- public class Person {
- String name;
- private int age;
- public Person(){}
- public Person(String name){
- this.name=name;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- }
- package cn.sgg.reflections;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.InputStream;
- import java.lang.reflect.Field;
- /**
- * 反射-测试类:
- *
- */
- public class TestReflect {
- public static void main(String[] args) {
- new TestReflect().testClassLoader();
- }
- /**
- * 测试反射的方法
- */
- static void getProperty(){
- //1、得到Class对象
- Class cls=Person.class;
- Field[] fields=cls.getDeclaredFields();
- //2、得到Class对象
- Object obj=new Person();
- Class cls2=obj.getClass();
- //3、得到Class对象
- try {
- Class<?> cls3=(Class<Person>) Class.forName("cn.sgg.reflections.Person");
- //获得类实例
- Object obj1=cls3.newInstance();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- static void testClassLoader(){
- //获取一个系统类加载器
- ClassLoader classLoader=ClassLoader.getSystemClassLoader();
- System.out.println("系统加载器:"+classLoader);
- //获取系统类加载器的父类的加载器
- ClassLoader parentLoader=classLoader.getParent();
- System.out.println("系统加载器的父类加载器:"+classLoader);
- //获取扩展类加载器的父类加载器
- classLoader=parentLoader.getParent();
- System.out.println("扩展类加载器的父类加载器:"+classLoader);
- //检测当前类是由哪个类加载器加载的
- try {
- ClassLoader classLoader2=Class.forName("cn.sgg.reflections.TestReflect").getClassLoader();
- System.out.println(classLoader2);
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }
- //检测JDK 提供的Object类由哪个类加载器负责加载的
- ClassLoader classLoader3;
- try {
- classLoader3 = Class.forName("java.lang.Object").getClassLoader();
- System.out.println(classLoader3);
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }
- //关于类加载器的一个重要方法:
- InputStream in=null;
- in=TestReflect.class.getResourceAsStream("xxxx.txt");
- }
- }
- 系统加载器:sun.misc.Launcher$AppClassLoader@18d107f
- 系统加载器的父类加载器:sun.misc.Launcher$AppClassLoader@18d107f
- 扩展类加载器的父类加载器:null
- sun.misc.Launcher$AppClassLoader@18d107f
- null
- 得到图片的刘对象:null
Class类和ClassLoader类的简单介绍的更多相关文章
- Qt中利用QTime类来控制时间,这里简单介绍一下QTime的成员函数的用法:
Qt中利用QTime类来控制时间,这里简单介绍一下QTime的成员函数的用法: ------------------------------------------------------------ ...
- 分析Class类和ClassLoader类下的同名方法getResourceAsStream
在读取本地资源的时候我们经常需要用到输入流,典型的场景就是使用Druid连接池时读取连接池的配置文件.Java为我们提供了读取资源的方法getResourceAsStream(),该方法有三种: Cl ...
- 反射(学习整理)----Class类和加载器ClassLoader类的整理
1.学习反射的时整理的笔记!Class类和ClassLoader类的简单介绍 反射机制中的Class Class内部到底有什么呢?看下图! 代码: Class cls=Person.class; .C ...
- 实例级别和类级别的static、构造函数、字段属性的简单介绍
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 实例级别 ...
- oc-12-NSString 类简单介绍及用法
// 11-[掌握]NSString 类简单介绍及用法 #import <Foundation/Foundation.h> int main(int argc, const char * ...
- InputStreamReader 和 OutputStreamWriter类使用方法简单介绍,及演示。
InputStreamReader 和 OutputStreamWriter类使用方法简单介绍. 一.InputStreamReader类 InputStreamReader 将字节流转换为字符流.是 ...
- 第一次玩博客,今天被安利了一个很方便JDBC的基于Spring框架的一个叫SimpleInsert的类,现在就来简单介绍一下
首先先对这段代码的简单介绍,我之前在需要操作JDBC的时候总是会因为经常要重新写SQL语句感到很麻烦.所以就能拿则拿不能拿的就简单地封装了一下. 首先是Insert.Spring框架的JDBC包里面的 ...
- Tstrings类简单介绍及实例
用TStrings保存文件;var S: TStrings;begin S := TStringList.Create(); { ... } S.SaveToFile('config.txt' ...
- c++string类的简单介绍
#include "iostream" #include "string" using namespace std; /*@author:浅滩 *family: ...
随机推荐
- 【linux使用】bash shell命令行常用快捷键
移动: Ctrl + A: 移动到当前编辑的命令行首, Ctrl + E: 移动到当前编辑的命令行尾, Ctrl + F 或 ->:按字符右移(往命令行尾部方向,前移) Ctrl + B 或 & ...
- node+express搭建个人网站(2)
node+express搭建个人网站(1)这一节中成功启动了一个网站但还很简陋,仅仅打印了一个helloworld的网页 作为个人网站,我们当然想输出自己设计好的网页, 我们借助 Express 应用 ...
- 【ASP.NET Core 】ASP.NET Core 源码学习之 Logging[1]:Introduction
在ASP.NET 4.X中,我们通常使用 log4net, NLog 等来记录日志,但是当我们引用的一些第三方类库使用不同的日志框架时,就比较混乱了.而在 ASP.Net Core 中内置了日志系统, ...
- 【Java】list转换json的中文乱码问题
添加如图红框内容
- 【Java】自动获取某表某列的最大ID数
使用场景: 当需要往数据库插入数据时,表的主键需要接着已经有的数据后面进行自增.比如已经wq_customer表里,主键为TBL_ID,如果是空表,那么插入的数据TBL_ID设置为1,如果已经有n条数 ...
- Day 2 笔记 数据结构
Day 2 笔记 数据结构 1.栈.队列.链表等数据结构都是线性数据结构 2.树状数据结构:二叉堆,线段树,树状数组,并查集,st表... 优先队列其实与二叉堆的存储方式并不相同. 一.二叉堆 1.二 ...
- debug - taotao项目 - IDEA拖动文件的自动重命名是超级巨坑, 一定要非常小心
大量的如下错误: org.springframework.beans.factory.BeanCreationException: Could not autowire field 还是要相信报错 不 ...
- Tajo--一个分布式数据仓库系统(分布式环境安装试用)
前面两篇介绍了一下tajo,下面就说一下安装和使用吧. 一.分布式安装 前提:hadoop2中的hdfs和yarn已经安装并运行正常. 1.下载source并build源码 $git clone ht ...
- Codeforces 585D. Lizard Era: Beginning(meet in the middle)
一眼题...这个数据范围也太明显了吧... suma1==suma2 && sumb1==sumb2 && sumc1==sumc2 相当于suma1-sumb1==s ...
- [ZJOI2011]细胞——斐波那契数列+矩阵加速+dp
Description bzoj2323 Solution 题目看起来非常复杂. 本质不同的细胞这个条件显然太啰嗦, 是否有些可以挖掘的性质? 1.发现,只要第一次分裂不同,那么互相之间一定是不同的( ...