您的位置:首页
Class类和ClassLoader类的简单介绍
2018-04-29 11:02
309 查看
反射机制中的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)上指定的类库。
举例: 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
相关文章推荐
- Class类的简单介绍
- Class类的简单介绍
- Python:class类的简单介绍
- 重装系统后的简单优化设置方法介绍
- UISrcoll控件简单介绍
- 关于VLAN配置的几个参数的简单介绍
- Linux curl使用简单介绍
- 基于注解的SpringMVC简单介绍
- 简单介绍三个C语言图形库C语言其实最擅长的是写纯数据处理的程序 . 非得用C语言写个界面程序那将会变得很困难 . 我刚开始学C语言就是从hello world 开始的 , 后来慢慢开始学从三个数中找
- Traceview MAT systrace简单介绍
- Web Tester 1.0 的简单介绍
- 简单介绍 ghost封装过程=-=-=-=带软件-=-=-=-=
- HTTP服务端接口模拟工具-HttpServerMockTool 1 工具功能介绍 这个工具可以通过简单的配置达到快速模拟第三方HTTP服务端接口的作用,替代以前要手写servlet代码再放到to
- Android EventBus简单介绍(一)
- VMKD windbg+vmWare进行两机调试的加速工具的介绍及原理简单分析
- JavaScript基础篇之变量作用域、传值、传址的简单介绍与实例
- 简单介绍tmc
- AssetsLibrary框架简单介绍
- Android EventBus简单介绍(二)
- stm32_020_spi简单介绍及stm32spi工作模式