zoukankan      html  css  js  c++  java
  • 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:UsersliqiangDesktop>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
  • 相关阅读:
    正则表达式运用到json断言与响应断言
    接口测试基础
    Jmeter接口测试流程
    性能测试基本概念
    数据库简介以及增删改查
    接口测试流程
    svn安装手册
    postman基本操作
    MySql数据库知识总结
    Liunx测试环境搭建详解
  • 原文地址:https://www.cnblogs.com/qlqwjy/p/8970620.html
Copyright © 2011-2022 走看看