反射(学习整理)----Class类和加载器ClassLoader类的整理
1、学习反射的时整理的笔记!Class类和ClassLoader类的简单介绍
- 反射机制中的Class
- Class内部到底有什么呢?看下图!
- 代码:
Class cls=Person.class;- 、Class类:
- 、 对象照镜子后可以得到的信息:某个类的数据成员名,方法和构造器、某个类到底实现了
- 哪些接口。对于每个类而言,JRE都为其保留一个不变的Class类型的对象。一个Class对象包
- 含可特定的某个类的有关信息。
- 、Class对象只能由系统建立对象。
- 、一个类在JVM中只会有一个Class实例。
- 、每个类的实例都会记得自己是由哪个Class实例产生的。
- 、Class本质上就是一个类!是一个用来描述指定类本身内部信息的一个类!
- 、得到Class对象【三种方法】
- 、直接通过: 类名.class
- Class cls=Person.class;
- 、getClass()方式
- Object obj=new Person();
- Class cls2=obj.getClass();
- 、Class.forName("包名.类名")【最常用】【框架使用的最多】
- try {
- Class cls3=Class.forName("cn.sgg.reflections.Person");
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }
- 、反射中的泛型
- 举例:
- Class<Person> cls3=(Class<Person>) Class.forName("cn.sgg.reflections.Person");
- Class<?> cls3=(Class<Person>) Class.forName("cn.sgg.reflections.Person");
- //?表示任意对象类型
- 、Class类中的方法
- 、创建类的实例的方法:newInstance()
- Class cls3=Class.forName("cn.sgg.reflections.Person");
- Object obj=cls3.newInstance();//得到实例(通过:无参构造器)
- Object obj=cls3.newInstance(new Class[]{String.class,int.class});//得到实例(通过:有参构造器)
- 说明:一般来说,一个类若声明了无参构造器,也要声明一个有参构造器!(有参的是留给反射用的!)
- 、Field<------>classType.getDeclaredFields();
- 、Method<----->getDeclaredMethod(getMethodName, new Class[]{});
- 、Constructor<------>getConstructor(new Class[]{int.class,String.class});
- 、反射的在哪里被使用?
- 框架中:
Servlet、Strust2等基础框架中......- 、类加载器:ClassLoader
- 说明:
- ClassLoader:类加载器是用来把类(class)装进JVM的。JVM规范定义了两种类型的类装载器。
- 启动类装载器(bootstap)
- 用户自定义装载器(user-defined class loader)。
- JVM在运行时会产生3个类加载器组成的初始化加载器层次结构,
- 如下图:
- 举例:
- 、//获取一个系统类加载器
- ClassLoader classLoader=ClassLoader.getSystemClassLoader();
- System.out.println(classLoader);
- 、//获取一个系统类加载器
- 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();
- }
- 、关于类加载器的一个重要方法:
- 系统类加载器可以加载本项目下的所有的对应的class文件和其他文件!/bin/xxx.文件后缀
- 举例:
- //关于类加载器的一个重要方法:
- InputStream in=TestReflect.class.getResourceAsStream("xxxx.txt");
2、下面是测试代码:
测试类1:
- package cn.sgg.reflections;
- /**
- * 反射--被测试类:
- * Created by Jason 2016-7-16 下午2:19:40
- */
- 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;
- }
- }
测试类2:
- package cn.sgg.reflections;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.InputStream;
- import java.lang.reflect.Field;
- /**
- * 反射-测试类:
- * Created by Jason 2016-7-16 下午2:22:05
- */
- 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类的整理的更多相关文章
- libgdx学习记录16——资源加载器AssetManager
AssetManager用于对游戏中的资源进行加载.当游戏中资源(图片.背景音乐等)较大时,加载时会需要较长时间,可能会阻塞渲染线程,使用AssetManager可以解决此类问题. 主要优点: 1. ...
- Java虚拟机学习(5):类加载器(ClassLoader
类加载器 类加载器(ClassLoader)用来加载 class字节码到 Java 虚拟机中.一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源文件在经过 Javac之后就被转换成 ...
- PowerBuilder学习笔记之删除和加载PBL文件的方法
删除PBL目录的方法:直接点删除键删除 加载PBL文件的方法:点Browse按钮选择PBL文件
- <连接器和加载器>——概述连接器和加载器
0.涉及术语 (1)地址绑定 将抽象的符号与更抽象的符号绑定,如 sqrt 符号与地址 0x0020010绑定. (2)符号解析 程序相互作用通过符号进行,如主程序调用库函数sqrt,连接器通过表明分 ...
- java 27 - 1 反射之 类的加载器
说到反射,首先说类的加载器. 类的加载: 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 加载: 就是指将class文件读入内存,并为之 ...
- 第42天学习打卡(Class类 Class类的常用方法 内存分析 类的加载过程 类加载器 反射操作泛型 反射操作注解)
Class类 对象照镜子后得到的信息:某个类的属性.方法和构造器.某个类到底实现了哪些接口.对于每个类而言,JRE都为其保留一个不变的Class类型的对象.一个Class对象包含了特定某个结构(cla ...
- 别翻了,这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析【JVM篇二】
目录 1.什么是类的加载(类初始化) 2.类的生命周期 3.接口的加载过程 4.解开开篇的面试题 5.理解首次主动使用 6.类加载器 7.关于命名空间 8.JVM类加载机制 9.双亲委派模型 10.C ...
- linux 编译,链接和加载
1. 序 最近在折腾各种.so,碰到了一些问题,一开始对于很多错误也没有头绪,茫然不知所措.索性化了一天多时间将<<程序员的自我修养—链接.装载与库>>中部分内容略读了一遍 ...
- <JVM中篇:字节码与类的加载篇>03-类的加载过程(类的生命周期)详解
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...
随机推荐
- 前端模块化开发篇之grunt&webpack篇
几个月前写了一篇有关gulp和browserify来做前端构建的博客,因为browserify用来做js的打包时可能有些麻烦(特别是在写React的时候),所以这里再强烈推荐一款js打包工具-webp ...
- poj 1654 Area(多边形面积)
Area Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 17456 Accepted: 4847 Description ...
- 使用Block来进行页面间的传值
Block语法 定义Block //定义类型 typedef void (^ReceiveMessageBlock)(NSString *); //申明变量 ReceiveMessageBlock t ...
- Bzoj1818: [Cqoi2010]内部白点 && Tyvj P2637 内部白点 扫描线,树状数组,离散化
1818: [Cqoi2010]内部白点 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 704 Solved: 344[Submit][Status] ...
- Genotype&&陨石的秘密
Genotype: Genotype 是一个有限的基因序列.它是由大写的英文字母A-Z组成,不同的字母表示不同种类的基因.一个基因可以分化成为一对新的基因.这种分化被一个定义的规则集合所控制.每个分化 ...
- ln命令
图形化界面创建ln 命令行界面创建ln 命令行界面创建ln 后续,更新
- 极客技术专题【007期】:jQuery初学者入门 - jQuery Event
日期:2013-8-19 来源:GBin1.com 技术专题介绍 专题:jQuery初学者入门[第三讲:jQuery Event] 分享人:极客标签技术编辑 -Lana (请站内关注分享人) 授课时 ...
- 几种不同风格的Toast
一般情况下,我们使用Toast默认的风格就行了,只是有些时候为了达到我们自己想要的效果需要自定义一下,包括自定义显示的位置,显示的内容以及完全自定义里面的布局,代码如下: activity: pack ...
- 实践javascript美术馆的小案例,学习到的东西还是蛮多的,包括javascript编程中的预留退路、分离javascript、以及实现向后兼容等
javascript美术馆(改进2) 一.javascript编程过程中的好习惯 1.实现预留退路 js被禁掉,图片也可以显示出来,href属性带有图片路径 <script src=" ...
- TreeView中节点勾选设置
本文转载:http://www.cnblogs.com/luxiaoxun/p/3288003.html 很不错的文章:http://www.cnblogs.com/allen0118/archive ...