1、学习反射的时整理的笔记!Class类和ClassLoader类的简单介绍

  1. 反射机制中的Class
  2. Class内部到底有什么呢?看下图!
  3. 代码:
      Class cls=Person.class;

  4. Class类:
  5. 对象照镜子后可以得到的信息:某个类的数据成员名,方法和构造器、某个类到底实现了
  6. 哪些接口。对于每个类而言,JRE都为其保留一个不变的Class类型的对象。一个Class对象包
  7. 含可特定的某个类的有关信息。
  8.  
  9. Class对象只能由系统建立对象。
  10.  
  11. 、一个类在JVM中只会有一个Class实例。
  12.  
  13. 、每个类的实例都会记得自己是由哪个Class实例产生的。
  14.  
  15. Class本质上就是一个类!是一个用来描述指定类本身内部信息的一个类!
  16.  
  17. 、得到Class对象【三种方法】
  18.  
  19. 、直接通过: 类名.class
  20.  
  21. Class cls=Person.class;
  22.  
  23. getClass()方式
  24.  
  25. Object obj=new Person();
  26. Class cls2=obj.getClass();
  27.  
  28. Class.forName("包名.类名")【最常用】【框架使用的最多】
  29. try {
  30. Class cls3=Class.forName("cn.sgg.reflections.Person");
  31. } catch (ClassNotFoundException e) {
  32. e.printStackTrace();
  33. }
  34. 、反射中的泛型
  35. 举例:
  36. Class<Person> cls3=(Class<Person>) Class.forName("cn.sgg.reflections.Person");
  37.  
  38. Class<?> cls3=(Class<Person>) Class.forName("cn.sgg.reflections.Person");
  39.  
  40. //?表示任意对象类型
  41.  
  42. Class类中的方法
  43.  
  44. 、创建类的实例的方法:newInstance()
  45.  
  46. Class cls3=Class.forName("cn.sgg.reflections.Person");
  47.  
  48. Object obj=cls3.newInstance();//得到实例(通过:无参构造器)
  49.  
  50. Object obj=cls3.newInstance(new Class[]{String.class,int.class});//得到实例(通过:有参构造器)
  51.  
  52. 说明:一般来说,一个类若声明了无参构造器,也要声明一个有参构造器!(有参的是留给反射用的!)
  53.  
  54. Field<------>classType.getDeclaredFields();
  55.  
  56. Method<----->getDeclaredMethod(getMethodName, new Class[]{});
  57.  
  58. Constructor<------>getConstructor(new Class[]{int.class,String.class});
  59.  
  60. 、反射的在哪里被使用?
  61.  
  62. 框架中:
          ServletStrust2等基础框架中......
  63.  
  64. 、类加载器:ClassLoader
  65.  
  66. 说明:
  67. ClassLoader:类加载器是用来把类(class)装进JVM的。JVM规范定义了两种类型的类装载器。
  68.  
  69. 启动类装载器(bootstap
  70.  
  71. 用户自定义装载器(user-defined class loader)。
  72.  
  73. JVM在运行时会产生3个类加载器组成的初始化加载器层次结构,
  74.  
  75. 如下图:

  76. 举例:
  77. //获取一个系统类加载器
  78. ClassLoader classLoader=ClassLoader.getSystemClassLoader();
  79. System.out.println(classLoader);
  80.  
  81. //获取一个系统类加载器
  82. ClassLoader classLoader=ClassLoader.getSystemClassLoader();
  83. System.out.println("系统加载器:"+classLoader);
  84.  
  85. //获取系统类加载器的父类的加载器
  86. ClassLoader parentLoader=classLoader.getParent();
  87. System.out.println("系统加载器的父类加载器:"+classLoader);
  88.  
  89. //获取扩展类加载器的父类加载器
  90. classLoader=parentLoader.getParent();
  91. System.out.println("扩展类加载器的父类加载器:"+classLoader);
  92.  
  93. //检测当前类是由哪个类加载器加载的
  94. try {
  95. ClassLoader classLoader2=Class.forName("cn.sgg.reflections.TestReflect").getClassLoader();
  96. System.out.println(classLoader2);
  97.  
  98. } catch (ClassNotFoundException e) {
  99. e.printStackTrace();
  100. }
  101.  
  102. //检测JDK 提供的Object类由哪个类加载器负责加载的
  103. ClassLoader classLoader3;
  104. try {
  105. classLoader3 = Class.forName("java.lang.Object").getClassLoader();
  106. System.out.println(classLoader3);
  107. } catch (ClassNotFoundException e) {
  108. e.printStackTrace();
  109. }
  110.  
  111. 、关于类加载器的一个重要方法:
  112.  
  113. 系统类加载器可以加载本项目下的所有的对应的class文件和其他文件!/bin/xxx.文件后缀
  114.  
  115. 举例:
  116. //关于类加载器的一个重要方法:
  117. InputStream in=TestReflect.class.getResourceAsStream("xxxx.txt");

 

2、下面是测试代码:

测试类1:

  1. package cn.sgg.reflections;
  2.  
  3. /**
  4. * 反射--被测试类:
  5. * Created by Jason 2016-7-16 下午2:19:40
  6. */
  7. public class Person {
  8. String name;
  9. private int age;
  10.  
  11. public Person(){}
  12. public Person(String name){
  13. this.name=name;
  14. }
  15. public String getName() {
  16. return name;
  17. }
  18. public void setName(String name) {
  19. this.name = name;
  20. }
  21. public int getAge() {
  22. return age;
  23. }
  24. public void setAge(int age) {
  25. this.age = age;
  26. }
  27. }

测试类2:

  1. package cn.sgg.reflections;
  2.  
  3. import java.io.FileInputStream;
  4. import java.io.FileNotFoundException;
  5. import java.io.InputStream;
  6. import java.lang.reflect.Field;
  7.  
  8. /**
  9. * 反射-测试类:
  10. * Created by Jason 2016-7-16 下午2:22:05
  11. */
  12. public class TestReflect {
  13.  
  14. public static void main(String[] args) {
  15. new TestReflect().testClassLoader();
  16. }
  17.  
  18. /**
  19. * 测试反射的方法
  20. */
  21. static void getProperty(){
  22.  
  23. //1、得到Class对象
  24. Class cls=Person.class;
  25.  
  26. Field[] fields=cls.getDeclaredFields();
  27. //2、得到Class对象
  28. Object obj=new Person();
  29. Class cls2=obj.getClass();
  30. //3、得到Class对象
  31. try {
  32. Class<?> cls3=(Class<Person>) Class.forName("cn.sgg.reflections.Person");
  33.  
  34. //获得类实例
  35. Object obj1=cls3.newInstance();
  36.  
  37. } catch (Exception e) {
  38. e.printStackTrace();
  39. }
  40. }
  41.  
  42. static void testClassLoader(){
  43.  
  44. //获取一个系统类加载器
  45. ClassLoader classLoader=ClassLoader.getSystemClassLoader();
  46. System.out.println("系统加载器:"+classLoader);
  47.  
  48. //获取系统类加载器的父类的加载器
  49. ClassLoader parentLoader=classLoader.getParent();
  50. System.out.println("系统加载器的父类加载器:"+classLoader);
  51.  
  52. //获取扩展类加载器的父类加载器
  53. classLoader=parentLoader.getParent();
  54. System.out.println("扩展类加载器的父类加载器:"+classLoader);
  55.  
  56. //检测当前类是由哪个类加载器加载的
  57. try {
  58. ClassLoader classLoader2=Class.forName("cn.sgg.reflections.TestReflect").getClassLoader();
  59. System.out.println(classLoader2);
  60.  
  61. } catch (ClassNotFoundException e) {
  62. e.printStackTrace();
  63. }
  64.  
  65. //检测JDK 提供的Object类由哪个类加载器负责加载的
  66. ClassLoader classLoader3;
  67. try {
  68. classLoader3 = Class.forName("java.lang.Object").getClassLoader();
  69. System.out.println(classLoader3);
  70. } catch (ClassNotFoundException e) {
  71. e.printStackTrace();
  72. }
  73.  
  74. //关于类加载器的一个重要方法:
  75. InputStream in=null;
  76. in=TestReflect.class.getResourceAsStream("xxxx.txt");
  77. }
  78. }

 测试结果:

  1. 系统加载器:sun.misc.Launcher$AppClassLoader@18d107f
  2. 系统加载器的父类加载器:sun.misc.Launcher$AppClassLoader@18d107f
  3. 扩展类加载器的父类加载器:null
  4. sun.misc.Launcher$AppClassLoader@18d107f
  5. null
  6. 得到图片的刘对象:null

反射(学习整理)----Class类和加载器ClassLoader类的整理的更多相关文章

  1. libgdx学习记录16——资源加载器AssetManager

    AssetManager用于对游戏中的资源进行加载.当游戏中资源(图片.背景音乐等)较大时,加载时会需要较长时间,可能会阻塞渲染线程,使用AssetManager可以解决此类问题. 主要优点: 1. ...

  2. Java虚拟机学习(5):类加载器(ClassLoader

    类加载器 类加载器(ClassLoader)用来加载 class字节码到 Java 虚拟机中.一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源文件在经过 Javac之后就被转换成 ...

  3. PowerBuilder学习笔记之删除和加载PBL文件的方法

    删除PBL目录的方法:直接点删除键删除 加载PBL文件的方法:点Browse按钮选择PBL文件

  4. <连接器和加载器>——概述连接器和加载器

    0.涉及术语 (1)地址绑定 将抽象的符号与更抽象的符号绑定,如 sqrt 符号与地址 0x0020010绑定. (2)符号解析 程序相互作用通过符号进行,如主程序调用库函数sqrt,连接器通过表明分 ...

  5. java 27 - 1 反射之 类的加载器

    说到反射,首先说类的加载器. 类的加载: 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 加载: 就是指将class文件读入内存,并为之 ...

  6. 第42天学习打卡(Class类 Class类的常用方法 内存分析 类的加载过程 类加载器 反射操作泛型 反射操作注解)

    Class类 对象照镜子后得到的信息:某个类的属性.方法和构造器.某个类到底实现了哪些接口.对于每个类而言,JRE都为其保留一个不变的Class类型的对象.一个Class对象包含了特定某个结构(cla ...

  7. 别翻了,这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析【JVM篇二】

    目录 1.什么是类的加载(类初始化) 2.类的生命周期 3.接口的加载过程 4.解开开篇的面试题 5.理解首次主动使用 6.类加载器 7.关于命名空间 8.JVM类加载机制 9.双亲委派模型 10.C ...

  8. linux 编译,链接和加载

    1.   序 最近在折腾各种.so,碰到了一些问题,一开始对于很多错误也没有头绪,茫然不知所措.索性化了一天多时间将<<程序员的自我修养—链接.装载与库>>中部分内容略读了一遍 ...

  9. <JVM中篇:字节码与类的加载篇>03-类的加载过程(类的生命周期)详解

    笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...

随机推荐

  1. 前端模块化开发篇之grunt&webpack篇

    几个月前写了一篇有关gulp和browserify来做前端构建的博客,因为browserify用来做js的打包时可能有些麻烦(特别是在写React的时候),所以这里再强烈推荐一款js打包工具-webp ...

  2. poj 1654 Area(多边形面积)

    Area Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 17456   Accepted: 4847 Description ...

  3. 使用Block来进行页面间的传值

    Block语法 定义Block //定义类型 typedef void (^ReceiveMessageBlock)(NSString *); //申明变量 ReceiveMessageBlock t ...

  4. Bzoj1818: [Cqoi2010]内部白点 && Tyvj P2637 内部白点 扫描线,树状数组,离散化

    1818: [Cqoi2010]内部白点 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 704  Solved: 344[Submit][Status] ...

  5. Genotype&&陨石的秘密

    Genotype: Genotype 是一个有限的基因序列.它是由大写的英文字母A-Z组成,不同的字母表示不同种类的基因.一个基因可以分化成为一对新的基因.这种分化被一个定义的规则集合所控制.每个分化 ...

  6. ln命令

    图形化界面创建ln 命令行界面创建ln 命令行界面创建ln 后续,更新

  7. 极客技术专题【007期】:jQuery初学者入门 - jQuery Event

    日期:2013-8-19  来源:GBin1.com 技术专题介绍 专题:jQuery初学者入门[第三讲:jQuery Event] 分享人:极客标签技术编辑 -Lana (请站内关注分享人) 授课时 ...

  8. 几种不同风格的Toast

    一般情况下,我们使用Toast默认的风格就行了,只是有些时候为了达到我们自己想要的效果需要自定义一下,包括自定义显示的位置,显示的内容以及完全自定义里面的布局,代码如下: activity: pack ...

  9. 实践javascript美术馆的小案例,学习到的东西还是蛮多的,包括javascript编程中的预留退路、分离javascript、以及实现向后兼容等

    javascript美术馆(改进2) 一.javascript编程过程中的好习惯 1.实现预留退路 js被禁掉,图片也可以显示出来,href属性带有图片路径 <script src=" ...

  10. TreeView中节点勾选设置

    本文转载:http://www.cnblogs.com/luxiaoxun/p/3288003.html 很不错的文章:http://www.cnblogs.com/allen0118/archive ...