Java基础_类的加载机制和反射
类的使用分为三个步骤:
类的加载->类的连接->类的初始化
一、类的加载
当程序运行的时候,系统会首先把我们要使用的Java类加载到内存中。这里加载的是编译后的.class文件
每个类加载到内存中,会创建一个对应的Class对象。这个Class对象保存了这个类有哪些成员(数据成员,方法成员)
注意:这里只有在某个Java类被使用的时候,才会被加载
加载时机:任何用到这个类的时候。(实例化,使用里面的静态静态成员....)
二、类加载器(JVM里面的一个东西)
作用:将.class文件(可能在磁盘上,也可能在网络上)加载到内存中,并生成与之对应的java.lang.Class对象。
分类:
Bootstrap ClassLoader 根类加载器 加载JRE中的核心类,比如java.lang.String 。。。
Extension ClassLoader 扩展类加载器 加载JRE中的扩展类
System ClassLoader 系统类加载器 一般用来加载我们自己写的类
三、反射
解释:在程序运行的时候,查看一个类有哪些信息(包含的数据成员和方法成员)。这个过程称之为反射。
如果我们知道我们要使用哪个类,那么我们只需要只用这个对应的类创建对象,然后就可以调用获取这个对象里面的数据和调用里面的方法。
(知道类,知道这个类里面有哪些属性和方法---->使用这个对象里面对应的属性和方法)
但是我们不知道我们要使用的是哪个类,这个时候我们需要使用反射获取到类的信息,里面有哪些成员,再使用。
(不知道---->获取类信息--->使用(实例化对象,调用属性和方法))反射
四、获取Class对象(反射的第一步)
方式一:通过对象获得
方式二:通过类获得
方式三:Class.forName("类路径")//必须传递完整路径(加上包名)
package com.Gary2; public class User { private int id;
private String username;
private String password; public User() {}; public User(int id,String username,String password) {
this.id = id;
this.username = username;
this.password = password;
} public void show(){
System.out.println(username+":"+password);
} public void study() {
System.out.println("学习");
} public void study(String courseName) {
System.out.println("正在学习"+courseName);
} }
User.java
方式一:通过对象获得
Class c1 = user1.getClass();
(通过User类获取到同一个User对象,一个类只能被加载一次,产生同一个User对象。)
package com.Gary2; public class GaryGetClass { public static void main(String[] args) {
//获取Class对象
User user1 = new User(100,"Gary","123");
User user2 = new User(200,"Gary2","456"); //获得c1对象
Class c1 = user1.getClass();
System.out.println(c1); //获得c2对象
Class c2 = user2.getClass();
System.out.println(c2); //判断两个对象是不是一样的
System.out.println(c1 == c2);
}
}
GaryGetClass.java
方式二:通过类
Class c2 = user2.getClass();
package com.Gary2; public class GaryGetClass { public static void main(String[] args) {
//获取Class对象
User user1 = new User(100,"Gary","123");
User user2 = new User(200,"Gary2","456"); //获得c1对象
Class c1 = user1.getClass();
System.out.println(c1); //获得c2对象
Class c2 = user2.getClass();
System.out.println(c2); //通过类获得User对象
Class c4 = User.class;
System.out.println(c4 == c1); }
}
GaryGetClass.java
方式三:Class.forName("类路径")//必须传递完整路径(加上包名)
Class c5 = Class.forName("com.Gary2.User"); //一定要加上包名
package com.Gary2; public class GaryGetClass { public static void main(String[] args) {
//获取Class对象
User user1 = new User(100,"Gary","123");
User user2 = new User(200,"Gary2","456"); //获得c1对象
Class c1 = user1.getClass();
System.out.println(c1); //获得c2对象
Class c2 = user2.getClass();
System.out.println(c2); //通过类获得User对象
Class c4 = User.class; //Class,forName
try {
Class c5 = Class.forName("com.Gary2.User"); //一定要加上包名
System.out.println(c5 == c4);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} }
}
GaryGetClass.java
五、利用反射构造对象
从Class对象中获取信息
getConstructors();//获取所有public构造方法信息
getConstructor(Class<?> ... parameterTypes );//根据参数类型,获取指定参数类型的public构造方法
getDeclaredConstructor(Class<?> ... parameterTypes );//忽略访问权限,获取构造方法
getDeclaredConstructors();//忽略访问权限,获取构造方法
getFields();//获得某个类的所有的公共(public)的字段,包括父类中的字段。
getDeclaredFields();//获得某个类的所有声明的字段,即包括public、private和proteced,但是不包括父类的申明字段。
getField();//设置公共全局变量
getDeclaredField;//仅能获取类本身的属性成员(包括私有、共有、保护)
getMethod();//获取当前类及所有继承的父类的public修饰的方法
getMethods();//获取所有公有方法
getDeclaredMethod();//该方法是获取本类以及父类或者父接口中所有的公共方法(public修饰符修饰的)
getDeclaredMethods();//该方法是获取本类中的所有方法,包括私有的(private、protected、默认以及public)的方法。
Constructor成员:
newInstance();//静态方法来实例化对象以便操作
setAccessible();//Accessable属性是继承自AccessibleObject 类. 功能是启用或禁用安全检查 ,提高java反射速度的方法method.setAccessible(true)
Java基础_类的加载机制和反射的更多相关文章
- 深入java虚拟机学习 -- 类的加载机制(续)
昨晚写 深入java虚拟机学习 -- 类的加载机制 都到1点半了,由于第二天还要工作,没有将上篇文章中的demo讲解写出来,今天抽时间补上昨晚的例子讲解. 这里我先把昨天的两份代码贴过来,重新看下: ...
- 深入java虚拟机学习 -- 类的加载机制
当看到"类的加载机制",肯定很多人都在想我平时也不接触啊,工作中无非就是写代码,不会了可以百度,至于类,jvm是怎么加载的我一点也不需要关心.在我刚开始工作的时候也觉得这些底层的内 ...
- 24.类的加载机制和反射.md
目录 1类的加载连接和初始化 1.1类的加载过程 1.2类的加载器 1.2.1类的加载机制 1类的加载连接和初始化 1.1类的加载过程 类的加载过程简单为分为三步:加载->连接->初始化 ...
- 深入java虚拟机学习 -- 类的加载机制(三)
类的初始化时机 在上篇文章中讲到了类的六种主动使用方式,反射是其中的一种(Class.forName("com.jack.test")),这里需要注意一点:当调用ClasLoade ...
- 深入java虚拟机学习 -- 类的加载机制(四)
类加载的命名空间 每个类加载器都有自己的命名空间,命名空间由所有以此加载器为初始类加载器的类组成,不同命名空间的两个类是不可见的,但只要得到类所对应的Class对象的refrence(反射),还是可以 ...
- jvm系列(一):java类的加载机制
java类的加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装 ...
- JVM(1):Java 类的加载机制
原文出处: 纯洁的微笑 java类的加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang. ...
- jvm系列 (五) ---类的加载机制
类的加载机制 目录 jvm系列(一):jvm内存区域与溢出 jvm系列(二):垃圾收集器与内存分配策略 jvm系列(三):锁的优化 jvm系列 (四) ---强.软.弱.虚引用 我的博客目录 什么是类 ...
- JVM-01:类的加载机制
本文从 纯洁的微笑的博客 转载 原地址:http://www.ityouknow.com/jvm.html 类的加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内 ...
随机推荐
- MangoDB CSharp Driver
1.引用MongoDB for C# Driver 从网上下载C#访问MongoDB的驱动,得到两个DLL: MongoDB.Driver.dll MongoDB.Bson.dll 将它们引用到项目中 ...
- [NOIP10.3模拟赛]3.w题解--神奇树形DP
题目链接: 咕 闲扯: 这题考场上把子任务都敲满了,5个namespace,400行11k 结果爆0了哈哈,因为写了个假快读只能读入一位数,所以手测数据都过了,交上去全TLE了 把边分成三类:0. 需 ...
- 基于【 springBoot +springCloud+vue 项目】二 || 后端框架详解
前言 在上一篇中,我们搭建了一个-API服务提供接口模块,目的为了提供了消费方进行调用.为什么不直接在service层直接提供调用接口,而是重新创建一个接口层模块?首先我们需要对Feign有所了解. ...
- Nginx如何配置禁止访问某个目录
location ~* \.(txt|doc)${ root /data/www/wwwroot/test; deny all; }
- 【坑】Java中遍历递归删除List元素
运行环境 idea 2017.1.1 需求背景 需要做一个后台,可以编辑资源列表用于权限管理 资源列表中可以有父子关系,假设根节点为0,以下以(父节点id,子节点id)表示 当编辑某个资源时,需要带出 ...
- (a ==1 && a== 2 && a==3) 有可能是 true 吗?
今天看到这个题目,感到很有意思,查找了些资料,各位牛人果然有高招解决: 方法一: var a = { i: 1, toString: function () { return a.i++; } } i ...
- PAT Basic 1084 外观数列 (20 分)
外观数列是指具有以下特点的整数序列: d, d1, d111, d113, d11231, d112213111, ... 它从不等于 1 的数字 d 开始,序列的第 n+1 项是对第 n 项的描述. ...
- IntelliJ IDEA + Maven iml文件中依赖项的需求是什么?
在Maven中,项目的依赖关系在pom.xml文件中指定.在IntelliJ IDEA中,即使对于Maven项目,相同的信息也存储在iml文件中.在两个地方有相同的信息需要什么? 当导入Maven项目 ...
- 使用html2canvas在手机端独立实现h5页面转图片
需求 方便用户把每日消息的海报图片分享到微信朋友圈进行消息扩散 实现方案 使用html2canvas 插件,html2canvas 1.0.0-alpha.11 ,github地址:https://g ...
- 如何用win10自带linux系统学习c语言---解决gdb使用问题
1.windos store---ubuntu18 2.改安装源 3.装gcc apt-install 即可 4.装gdb apt-instll 即可 5.写helloworld 记做 ...