博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Class类和ClassLoader类的简单介绍
阅读量:5907 次
发布时间:2019-06-19

本文共 7153 字,大约阅读时间需要 23 分钟。

反射机制中的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
cls3=(Class
) Class.forName("cn.sgg.reflections.Person"); Class
cls3=(Class
) 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 
其中, 可能的选项包括: -g 生成所有调试信息 -g:none 不生成任何调试信息 -g:{lines,vars,source} 只生成某些调试信息 -nowarn 不生成任何警告 -verbose 输出有关编译器正在执行的操作的消息 -deprecation 输出使用已过时的 API 的源位置 -classpath
<路径>
指定查找用户类文件和注释处理程序的位置 -cp
<路径>
指定查找用户类文件和注释处理程序的位置 -sourcepath
<路径>
指定查找输入源文件的位置 -bootclasspath
<路径>
覆盖引导类文件的位置 -extdirs
<目录>
覆盖所安装扩展的位置 -endorseddirs
<目录>
覆盖签名的标准路径的位置 -proc:{none,only} 控制是否执行注释处理和/或编译。 -processor
[,
,
...] 要运行的注释处理程序的名称; 绕过默认 -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
) 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扩展类加载器的父类加载器:nullsun.misc.Launcher$AppClassLoader@18d107fnull得到图片的刘对象:null

 

转载地址:http://bjcpx.baihongyu.com/

你可能感兴趣的文章
MySql
查看>>
sql server 下载安装标记
查看>>
js运算符(运算符的结合性)
查看>>
idea 编译级别的设置
查看>>
内置对象Array的原型对象中添加方法
查看>>
6大设计原则
查看>>
Github简介
查看>>
CISCO2691的OSPF点对点密文测评测试
查看>>
POJ 1661 Help Jimmy(递推DP)
查看>>
Node.js 中文学习资料和教程导航
查看>>
查找(AVL平衡二叉树)
查看>>
AJAX-初学AJAX本地环境配置
查看>>
【精选】Nginx负载均衡学习笔记(一)实现HTTP负载均衡和TCP负载均衡(官方和OpenResty两种负载配置)...
查看>>
Linux常用基本命令( rmdir, rm, mv )
查看>>
POJ2406 Power Strings(KMP)
查看>>
JavaScript-console的使用_016
查看>>
两种方式设置iframe的高度区别
查看>>
Iterator 和 for...of 循环
查看>>
关于iOS 11.x微信连wifi流程中,在Portal页无法拉起微信问题的简单记录
查看>>
Python GUI库wxPython官网Hello World示例的逐行解释
查看>>