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

、Class类:
、 对象照镜子后可以得到的信息:某个类的数据成员名,方法和构造器、某个类到底实现了
哪些接口。对于每个类而言,JRE都为其保留一个不变的Class类型的对象。一个Class对象包
含可特定的某个类的有关信息。
、Class对象只能由系统建立对象。
、一个类在JVM中只会有一个Class实例。
、每个类的实例都会记得自己是由哪个Class实例产生的。
、Class本质上就是一个类!是一个用来描述指定类本身内部信息的一个类!
、得到Class对象【三种方法】
、直接通过: 类名.class
Class cls=Person.class;
、getClass()方式
Object obj=new Person();
Class cls2=obj.getClass();
、Class.forName("包名.类名")【最常用】【框架使用的最多】
try {
Class cls3=Class.forName("cn.sgg.reflections.Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
、反射中的泛型
举例:
Class<Person> cls3=(Class<Person>) Class.forName("cn.sgg.reflections.Person");
Class<?> cls3=(Class<Person>) Class.forName("cn.sgg.reflections.Person");
//?表示任意对象类型
、Class类中的方法
、创建类的实例的方法:newInstance()
Class cls3=Class.forName("cn.sgg.reflections.Person");
Object obj=cls3.newInstance();//得到实例(通过:无参构造器)
Object obj=cls3.newInstance(new Class[]{String.class,int.class});//得到实例(通过:有参构造器)
说明:一般来说,一个类若声明了无参构造器,也要声明一个有参构造器!(有参的是留给反射用的!)
、Field<------>classType.getDeclaredFields();
、Method<----->getDeclaredMethod(getMethodName, new Class[]{});
、Constructor<------>getConstructor(new Class[]{int.class,String.class});
、反射的在哪里被使用?
框架中:
Servlet、Strust2等基础框架中......
、类加载器:ClassLoader
说明:
ClassLoader:类加载器是用来把类(class)装进JVM的。JVM规范定义了两种类型的类装载器。
启动类装载器(bootstap)
用户自定义装载器(user-defined class loader)。
JVM在运行时会产生3个类加载器组成的初始化加载器层次结构,
如下图:

举例:
、//获取一个系统类加载器
ClassLoader classLoader=ClassLoader.getSystemClassLoader();
System.out.println(classLoader);
、//获取一个系统类加载器
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();
}
、关于类加载器的一个重要方法:
系统类加载器可以加载本项目下的所有的对应的class文件和其他文件!/bin/xxx.文件后缀
举例:
//关于类加载器的一个重要方法:
InputStream in=TestReflect.class.getResourceAsStream("xxxx.txt");
2、下面是测试代码:
测试类1:
package cn.sgg.reflections; /**
* 反射--被测试类:
* Created by Jason 2016-7-16 下午2:19:40
*/
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;
}
}
测试类2:
package cn.sgg.reflections; import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.lang.reflect.Field; /**
* 反射-测试类:
* Created by Jason 2016-7-16 下午2:22:05
*/
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类和加载器ClassLoader类的整理的更多相关文章
- libgdx学习记录16——资源加载器AssetManager
AssetManager用于对游戏中的资源进行加载.当游戏中资源(图片.背景音乐等)较大时,加载时会需要较长时间,可能会阻塞渲染线程,使用AssetManager可以解决此类问题. 主要优点: 1. ...
- Java虚拟机学习(5):类加载器(ClassLoader
类加载器 类加载器(ClassLoader)用来加载 class字节码到 Java 虚拟机中.一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源文件在经过 Javac之后就被转换成 ...
- PowerBuilder学习笔记之删除和加载PBL文件的方法
删除PBL目录的方法:直接点删除键删除 加载PBL文件的方法:点Browse按钮选择PBL文件
- <连接器和加载器>——概述连接器和加载器
0.涉及术语 (1)地址绑定 将抽象的符号与更抽象的符号绑定,如 sqrt 符号与地址 0x0020010绑定. (2)符号解析 程序相互作用通过符号进行,如主程序调用库函数sqrt,连接器通过表明分 ...
- java 27 - 1 反射之 类的加载器
说到反射,首先说类的加载器. 类的加载: 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 加载: 就是指将class文件读入内存,并为之 ...
- 第42天学习打卡(Class类 Class类的常用方法 内存分析 类的加载过程 类加载器 反射操作泛型 反射操作注解)
Class类 对象照镜子后得到的信息:某个类的属性.方法和构造器.某个类到底实现了哪些接口.对于每个类而言,JRE都为其保留一个不变的Class类型的对象.一个Class对象包含了特定某个结构(cla ...
- 别翻了,这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析【JVM篇二】
目录 1.什么是类的加载(类初始化) 2.类的生命周期 3.接口的加载过程 4.解开开篇的面试题 5.理解首次主动使用 6.类加载器 7.关于命名空间 8.JVM类加载机制 9.双亲委派模型 10.C ...
- linux 编译,链接和加载
1. 序 最近在折腾各种.so,碰到了一些问题,一开始对于很多错误也没有头绪,茫然不知所措.索性化了一天多时间将<<程序员的自我修养—链接.装载与库>>中部分内容略读了一遍 ...
- <JVM中篇:字节码与类的加载篇>03-类的加载过程(类的生命周期)详解
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...
随机推荐
- 搭建Git远程仓库(也就是Git服务器,不用再连Github了)
github上一般托管的代码都是公开的,任何人都可以查看.复制下载等,而私有的项目则需要付费.所以可以自己搭建一个git服务,自己人用. 首先安装git: sudo apt-get install g ...
- 将批量下载的博客导入到手机后,通过豆约翰博客阅读器APP(Android手机)进行浏览,白字黑底,保护眼睛,图文并茂。
首先下面演示的博文来自于以下地址:http://www.douban.com/note/423939291/ 需要先通过博客备份专家将导出的博文导入到手机(还不会用的朋友请先阅读http://www. ...
- 理解newid()和newsequentialid()
原文地址:http://blog.csdn.net/xushichang/article/details/4390957 1.:newsequentialid 函数比起 newid 函数最大的好处是: ...
- 将多个Sheet导入到同一个Excel文件中
实体类excel import java.util.List; /** * 功能: * 描述: * @author * @date 2015-3-19 下午5:15:48 */ public clas ...
- Codeforces 296C Greg and Array
数据结构题.个人认为是比较好的数据结构题.题意:给定一个长度为n的数组a,然后给定m个操作序列,每个操作:l, r, x将区间[l, r]内的元素都增加a,然后有k个查询,查询形式是对于操作序列x,y ...
- Java开源建站工具
http://www.ruanyifeng.com/blog/2011/08/opensource_java_web_development_tools.html 作者: 阮一峰 日期: 2011年8 ...
- android4.0 FaceDetection笔记
这几天研究了下andoid4.0.3的FaceDetection这里写一下大致的流程,方便日后查阅. 相关说明可以在这里找到: frameworks/base/docs/html/guide/topi ...
- 使用Java程序发送Email
目前很多大型的网站忘记登录密码常见的一种形式是使用邮箱找回密码 最近做项目也有这个需求 现在总结一下 以便以后查看 使用到的包有 mailapi.jar smtp.jar 封装发送邮 ...
- 备战“软考”之软件project
说到"软件project"就有一种非常纠结的感觉!为什么呢?由于刚进入软考复习阶段,大家都把它放到了"比較"次要的地位,由于已经学过两遍,再加上它没有非常难理解 ...
- Codeforces Round #198 (Div. 2) D. Bubble Sort Graph (转化为最长非降子序列)
D. Bubble Sort Graph time limit per test 1 second memory limit per test 256 megabytes input standard ...