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:\Users\liqiang\Desktop>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
Class类和ClassLoader类的简单介绍的更多相关文章
- Qt中利用QTime类来控制时间,这里简单介绍一下QTime的成员函数的用法:
Qt中利用QTime类来控制时间,这里简单介绍一下QTime的成员函数的用法: ------------------------------------------------------------ ...
- 分析Class类和ClassLoader类下的同名方法getResourceAsStream
在读取本地资源的时候我们经常需要用到输入流,典型的场景就是使用Druid连接池时读取连接池的配置文件.Java为我们提供了读取资源的方法getResourceAsStream(),该方法有三种: Cl ...
- 反射(学习整理)----Class类和加载器ClassLoader类的整理
1.学习反射的时整理的笔记!Class类和ClassLoader类的简单介绍 反射机制中的Class Class内部到底有什么呢?看下图! 代码: Class cls=Person.class; .C ...
- 实例级别和类级别的static、构造函数、字段属性的简单介绍
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 实例级别 ...
- oc-12-NSString 类简单介绍及用法
// 11-[掌握]NSString 类简单介绍及用法 #import <Foundation/Foundation.h> int main(int argc, const char * ...
- InputStreamReader 和 OutputStreamWriter类使用方法简单介绍,及演示。
InputStreamReader 和 OutputStreamWriter类使用方法简单介绍. 一.InputStreamReader类 InputStreamReader 将字节流转换为字符流.是 ...
- 第一次玩博客,今天被安利了一个很方便JDBC的基于Spring框架的一个叫SimpleInsert的类,现在就来简单介绍一下
首先先对这段代码的简单介绍,我之前在需要操作JDBC的时候总是会因为经常要重新写SQL语句感到很麻烦.所以就能拿则拿不能拿的就简单地封装了一下. 首先是Insert.Spring框架的JDBC包里面的 ...
- Tstrings类简单介绍及实例
用TStrings保存文件;var S: TStrings;begin S := TStringList.Create(); { ... } S.SaveToFile('config.txt' ...
- c++string类的简单介绍
#include "iostream" #include "string" using namespace std; /*@author:浅滩 *family: ...
随机推荐
- Mysql中的索引
索引 什么是索引? 索引是系统内部自动维护的隐藏的“数据表”,它的作用是,可以极大地加快数据的查找速度! 这个隐藏的数据表,其中的数据是自动排好序的,其查找速度就是建立在这个基础上. 通常,所谓建立索 ...
- vue render function
vue render function https://vuejs.org/v2/guide/render-function.html { // Same API as `v-bind:class`, ...
- luogu 2115 破坏(01分数规划)
题意:给出一个序列,删除一个连续的子串后使得剩下的平均值最小. 典型的01分数规划,令f(x)=(sum1[i]+sum2[j])/(i+j).sum1表示前缀和,sum2表示后缀和,那么我们就相当于 ...
- 洛谷 P2146 [NOI2015]软件包管理器
真没有想到,这竟然会是一道NOI的原题,听RQY说,这套题是北大出的,北大脑抽认为树剖很难... 只恨没有早学几年OI,只A这一道题也可以出去吹自己一A了NOI原题啊 好了,梦该醒了,我们来看题 以后 ...
- Qt消息机制和事件
Qt消息机制和事件 1 事件 事件(event)是由系统或者 Qt 本身在不同的时刻发出的.当用户按下鼠标.敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件.一些事件在对用户操作做出响应 ...
- [CF1103B]Game with modulo
题目大意:交互题,有一个数$a(a\leqslant10^9)$,需要猜出它的值,一次询问为你两个数字$x,y(x,y\in[0,2\times10^9])$: 若$x\bmod a\geqslant ...
- <深入理解计算机系统>第七章读书笔记
第七章读书笔记 链接 链接:将各种代码和数据部分收集起来并组合成为一个单一文件的过程.(这个文件可被加载或拷贝到存储器并执行) 链接可以执行于编译,加载或运行时. 静态链接: 两个主要任务: 1 符号 ...
- selenium - javascript - 滚动条
虽然WebDriver提供了操作浏览器的前进和后退方法,但对于浏览器滚动条并没有提供相应的操作方法.在这种情况下,就可以借助JavaScript来控制浏览器的滚动条.WebDriver提供了execu ...
- 洛谷P1195 口袋的天空
口袋的天空 327通过 749提交 题目提供者该用户不存在 标签云端 难度普及+/提高 时空限制1s / 128MB 提交 讨论 题解 最新讨论更多讨论 暂时没有讨论 题目背景 小杉坐在教室里,透 ...
- vmvare-centos7-vim
centos7网络连不上问题 http://geekflare.com/no-internet-connection-from-vmware-with-centos-7/ http://www.jia ...