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

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

  1. C:\Users\liqiang\Desktop>javac
  2. 用法: javac <options> <source files>
  3. 其中, 可能的选项包括:
  4. -g 生成所有调试信息
  5. -g:none 不生成任何调试信息
  6. -g:{lines,vars,source} 只生成某些调试信息
  7. -nowarn 不生成任何警告
  8. -verbose 输出有关编译器正在执行的操作的消息
  9. -deprecation 输出使用已过时的 API 的源位置
  10. -classpath <路径> 指定查找用户类文件和注释处理程序的位置
  11. -cp <路径> 指定查找用户类文件和注释处理程序的位置
  12. -sourcepath <路径> 指定查找输入源文件的位置
  13. -bootclasspath <路径> 覆盖引导类文件的位置
  14. -extdirs <目录> 覆盖所安装扩展的位置
  15. -endorseddirs <目录> 覆盖签名的标准路径的位置
  16. -proc:{none,only} 控制是否执行注释处理和/或编译。
  17. -processor <class1>[,<class2>,<class3>...] 要运行的注释处理程序的名称; 绕过默认
  18. -processorpath <路径> 指定查找注释处理程序的位置
  19. -d <目录> 指定放置生成的类文件的位置
  20. -s <目录> 指定放置生成的源文件的位置
  21. -implicit:{none,class} 指定是否为隐式引用文件生成类文件
  22. -encoding <编码> 指定源文件使用的字符编码
  23. -source <发行版> 提供与指定发行版的源兼容性
  24. -target <发行版> 生成特定 VM 版本的类文件
  25. -version 版本信息
  26. -help 输出标准选项的提要
  27. -A关键字[=值] 传递给注释处理程序的选项
  28. -X 输出非标准选项的提要
  29. -J<标记> 直接将 <标记> 传递给运行时系统
  30. -Werror 出现警告时终止编译
  31. @<文件名> 从文件读取选项和文件名
  1. 举例:
  2. 1//获取一个系统类加载器
  3. ClassLoader classLoader=ClassLoader.getSystemClassLoader();
  4. System.out.println(classLoader);
  5.  
  6. 2//获取一个系统类加载器
  7. ClassLoader classLoader=ClassLoader.getSystemClassLoader();
  8. System.out.println("系统加载器:"+classLoader);
  9.  
  10. 3//获取系统类加载器的父类的加载器
  11. ClassLoader parentLoader=classLoader.getParent();
  12. System.out.println("系统加载器的父类加载器:"+classLoader);
  13.  
  14. 4//获取扩展类加载器的父类加载器
  15. classLoader=parentLoader.getParent();
  16. System.out.println("扩展类加载器的父类加载器:"+classLoader);
  17.  
  18. 5//检测当前类是由哪个类加载器加载的
  19. try {
  20. ClassLoader classLoader2=Class.forName("cn.sgg.reflections.TestReflect").getClassLoader();
  21. System.out.println(classLoader2);
  22.  
  23. } catch (ClassNotFoundException e) {
  24. e.printStackTrace();
  25. }
  26.  
  27. 6//检测JDK 提供的Object类由哪个类加载器负责加载的
  28. ClassLoader classLoader3;
  29. try {
  30. classLoader3 = Class.forName("java.lang.Object").getClassLoader();
  31. System.out.println(classLoader3);
  32. } catch (ClassNotFoundException e) {
  33. e.printStackTrace();
  34. }
  35.  
  36. 7、关于类加载器的一个重要方法:
  37.  
  38. 系统类加载器可以加载本项目下的所有的对应的class文件和其他文件!/bin/xxx.文件后缀
  39.  
  40. 举例:
  41. //关于类加载器的一个重要方法:
  42. InputStream in=TestReflect.class.getResourceAsStream("xxxx.txt");

测试代码:

  1. package cn.sgg.reflections;
  2.  
  3. /**
  4. * 反射--被测试类:
  5. */
  6. public class Person {
  7. String name;
  8. private int age;
  9.  
  10. public Person(){}
  11. public Person(String name){
  12. this.name=name;
  13. }
  14. public String getName() {
  15. return name;
  16. }
  17. public void setName(String name) {
  18. this.name = name;
  19. }
  20. public int getAge() {
  21. return age;
  22. }
  23. public void setAge(int age) {
  24. this.age = age;
  25. }
  26. }
  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. *
  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. Qt中利用QTime类来控制时间,这里简单介绍一下QTime的成员函数的用法:

    Qt中利用QTime类来控制时间,这里简单介绍一下QTime的成员函数的用法: ------------------------------------------------------------ ...

  2. 分析Class类和ClassLoader类下的同名方法getResourceAsStream

    在读取本地资源的时候我们经常需要用到输入流,典型的场景就是使用Druid连接池时读取连接池的配置文件.Java为我们提供了读取资源的方法getResourceAsStream(),该方法有三种: Cl ...

  3. 反射(学习整理)----Class类和加载器ClassLoader类的整理

    1.学习反射的时整理的笔记!Class类和ClassLoader类的简单介绍 反射机制中的Class Class内部到底有什么呢?看下图! 代码: Class cls=Person.class; .C ...

  4. 实例级别和类级别的static、构造函数、字段属性的简单介绍

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 实例级别 ...

  5. oc-12-NSString 类简单介绍及用法

    // 11-[掌握]NSString 类简单介绍及用法 #import <Foundation/Foundation.h> int main(int argc, const char * ...

  6. InputStreamReader 和 OutputStreamWriter类使用方法简单介绍,及演示。

    InputStreamReader 和 OutputStreamWriter类使用方法简单介绍. 一.InputStreamReader类 InputStreamReader 将字节流转换为字符流.是 ...

  7. 第一次玩博客,今天被安利了一个很方便JDBC的基于Spring框架的一个叫SimpleInsert的类,现在就来简单介绍一下

    首先先对这段代码的简单介绍,我之前在需要操作JDBC的时候总是会因为经常要重新写SQL语句感到很麻烦.所以就能拿则拿不能拿的就简单地封装了一下. 首先是Insert.Spring框架的JDBC包里面的 ...

  8. Tstrings类简单介绍及实例

    用TStrings保存文件;var  S: TStrings;begin  S := TStringList.Create();  { ... }  S.SaveToFile('config.txt' ...

  9. c++string类的简单介绍

    #include "iostream" #include "string" using namespace std; /*@author:浅滩 *family: ...

随机推荐

  1. 【linux使用】bash shell命令行常用快捷键

    移动: Ctrl + A: 移动到当前编辑的命令行首, Ctrl + E: 移动到当前编辑的命令行尾, Ctrl + F 或 ->:按字符右移(往命令行尾部方向,前移) Ctrl + B 或 & ...

  2. node+express搭建个人网站(2)

    node+express搭建个人网站(1)这一节中成功启动了一个网站但还很简陋,仅仅打印了一个helloworld的网页 作为个人网站,我们当然想输出自己设计好的网页, 我们借助 Express 应用 ...

  3. 【ASP.NET Core 】ASP.NET Core 源码学习之 Logging[1]:Introduction

    在ASP.NET 4.X中,我们通常使用 log4net, NLog 等来记录日志,但是当我们引用的一些第三方类库使用不同的日志框架时,就比较混乱了.而在 ASP.Net Core 中内置了日志系统, ...

  4. 【Java】list转换json的中文乱码问题

    添加如图红框内容

  5. 【Java】自动获取某表某列的最大ID数

    使用场景: 当需要往数据库插入数据时,表的主键需要接着已经有的数据后面进行自增.比如已经wq_customer表里,主键为TBL_ID,如果是空表,那么插入的数据TBL_ID设置为1,如果已经有n条数 ...

  6. Day 2 笔记 数据结构

    Day 2 笔记 数据结构 1.栈.队列.链表等数据结构都是线性数据结构 2.树状数据结构:二叉堆,线段树,树状数组,并查集,st表... 优先队列其实与二叉堆的存储方式并不相同. 一.二叉堆 1.二 ...

  7. debug - taotao项目 - IDEA拖动文件的自动重命名是超级巨坑, 一定要非常小心

    大量的如下错误: org.springframework.beans.factory.BeanCreationException: Could not autowire field 还是要相信报错 不 ...

  8. Tajo--一个分布式数据仓库系统(分布式环境安装试用)

    前面两篇介绍了一下tajo,下面就说一下安装和使用吧. 一.分布式安装 前提:hadoop2中的hdfs和yarn已经安装并运行正常. 1.下载source并build源码 $git clone ht ...

  9. Codeforces 585D. Lizard Era: Beginning(meet in the middle)

    一眼题...这个数据范围也太明显了吧... suma1==suma2 && sumb1==sumb2 && sumc1==sumc2 相当于suma1-sumb1==s ...

  10. [ZJOI2011]细胞——斐波那契数列+矩阵加速+dp

    Description bzoj2323 Solution 题目看起来非常复杂. 本质不同的细胞这个条件显然太啰嗦, 是否有些可以挖掘的性质? 1.发现,只要第一次分裂不同,那么互相之间一定是不同的( ...