java 反射 内存_Java 反射
Java 反射
正常的类加载过程
当执行new xxx();语句时,JVM会被触发加载.class文件
JVM从本地文件找到class文件并且加载到内存中
JVM自动创建一个class对象 (一个类只产生一个class对象)
将Java的二进制代码合并到JVM的运行状态之中
验证: 确保类的信息符合JVM规范,没有安全问题
准备: 正式为类变量分配内存并设置默认初始值(都在方法区进行分配)
解析: 虚拟机常量池内的符号引用(常量名)替换为直接引用(地址)的过程
初始化
JAVA内存分析
堆
存放new的对象和数组
可以被所有的线程共享,不会存放别的对象引用
栈
存放基本变量类型
引用对象的变量
方法区
可以被所有的线程共享
包含了所有的class和static变量
类加载
PS: 这里仅仅是大概、其中省略了某些步骤
加载
将类中的静态变量、方法等重新构建成一个新的数据结构
生成Class对象
验证
分配内存
为类变量分配内存,设置初始值,在方法区中进行分配
解析
将变量替换成直接引用
初始化
执行 方法:编译器按照顺序,依次收集类变量的赋值语句以及static块中的语句整合产生
public class Test04 {
public static void main(String[] args) {
A a = new A();
System.out.println(A.m);
}
}
class A {
static {
System.out.println("A -- static");
m = 100;
}
static int m = 200;
public A() {
System.out.println("A -- construct");
}
}
// A -- static
// A -- construct
// 200
public class Test04 {
public static void main(String[] args) {
A a = new A();
System.out.println(A.m);
}
}
class A {
static int m = 200;
static {
System.out.println("A -- static");
m = 100;
}
public A() {
System.out.println("A -- construct");
}
}
// A -- static
// A -- construct
// 100
优缺点
优点:
在运行时获得类的各种内容,进行反编译,代码可以在运行时装配
缺点:
消耗资源
安全问题
反射本质
得到class对象,反向获取实体对象的各种信息
反射机制
将类的各个组成部分封装成其他对象
优点
可以在程序运行过程中操作这些对象、
解耦
获取Class对象的方式
Class.forName("全类名");// 将字节码文件加载到内存,返回Class对象多用于配置文件
类名.class // 通过类名属性class获取 多用于参数传递
对象.getClass() // Object中定义了方法 多用于对象的获取字节码方式
package reflection;
import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;
import java.security.PublicKey;
public class Test02 {
public static void main(String[] args) throws ClassNotFoundException {
Person person = new Student(); // 所对应的Class是Person而非Student
Student student = new Student();
Teacher teacher = new Teacher();
System.out.println("This is " + person.name);
// 通过对象获得
Class c1 = person.getClass();
// forname
Class c2 = Class.forName("reflection.Student");
// 通过类名.class
Class c3 = Student.class;
// 基本内置类型的包装类有一个Type属性
Class c4 = Integer.TYPE;
System.out.println(c1.hashCode());
System.out.println(c2.hashCode());
System.out.println(c3.hashCode());
System.out.println(c4.hashCode());
// 获取父类类型
Class c5 = c1.getSuperclass();
System.out.println(c5);
Class c6 = teacher.getClass();
Class c7 = student.getClass();
System.out.println("teacher " + c6);
System.out.println("teacher hash " + c6.hashCode());
System.out.println("teacher super hash " + c6.getSuperclass().hashCode());
System.out.println("student hash " + c7.hashCode());
System.out.println("student super hash " + c7.getSuperclass().hashCode());
}
}
class Person {
public String name;
public Person(String name) {
this.name = name;
}
public Person() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
'}';
}
}
class Student extends Person {
public Student() {
this.name = "Student";
}
}
class Teacher extends Person {
public Teacher() {
this.name = "Teacher";
}
}
使用Class对象
获取属性
获取成员变量
获取构造方法
public Constructor>[] getConstructors()// 获取所有的Public构造方法
public Constructor>[] getDeclaredConstructors()// 获取所有的构造方法(所 有 !)
public Constructor getConstructor(Class>... parameterTypes)//获取单个共有的构造方法
public Constructor getDeclaredConstructor(Class... parameterTypes)//获取某个构造方法(任意)
获取成员方法
获取类名
用反射机制创建实例
用Class对象的newInstance
Class c = String.class;
Object str = c.newInstance();
str += "123456";
System.out.println(str);
获取Constructor,通过Constructor创建实例
// Person.java(Person类)
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 创建实例 Test.java (主类)
// 获取Class对象
Class> p = Person.class;
// 通过获取的Class对象获取Constructor对象 (其中里面依次填入的是参数类型)
Constructor> constructor = p.getConstructor(String.class, int.class);
// 根据Constructor创建实例
Object person = constructor.newInstance("szx", 19);
System.out.println(person);
java 反射 内存_Java 反射相关推荐
- java 反射 内存_Java内存到反射入门
Java内存到反射入门(一) 初识Java内存 平常我们最常提到的的JAVA分区是这三个分区 其中方法区是一个特殊的堆,功能如图上所示. 初识反射:框架设计的灵魂 反射的功能:将类的各个组成部分封装为 ...
- java 反射机制_Java反射机制原理探究
反射是Java中的一个重要的特性,使用反射可以在运行时动态生成对象.获取对象属性以及调用对象方法.与编译期的静态行为相对,所有的静态型操作都在编译期完成,而反射的所有行为基本都是在运行时进行的,这是一 ...
- java 反射练习_JAVA反射的基础学习
反射 :reflection 程序的一种内省机制 程序可以在运行期间动态的创建对象,获取对象类型,调用对象行为 内省机制在java和.net语言中有,在早期的C,C++,delphi,vb这些语言都没 ...
- java反射类型转换_java反射(转)
反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)) 一.反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道 ...
- java 反射代价_Java反射机制
# 反射 ## 什么是反射 反射是Java提供的动态执行机制, 可以动态加载类, 动态创建对象, 动态访问属性, 动态调用方法.. 静态执行: Java代码经过编译以后就确定的执行次序, 称为静态执行 ...
- java反射模式_Java反射机制详解
对于一般的开发者,很少需要直接使用Java反射机制来完成功能开发,但是反射是很多框架譬如 Spring, Mybatis 实现的核心,反射虽小,能量却很大. 本文主要介绍反射相关的概念以及API的使用 ...
- Java的反射作用_java反射机制的作用与优点
java的反射机制就是增加程序的灵活性,避免将程序写死到代码里, 例如: 实例化一个 person()对象, 不使用反射, new person(); 如果想变成 实例化 其他类, 那么必须修改源代码 ...
- java映射理解_Java反射的理解
Java反射的理解 反射之中包含了一个「反」字,所以想要解释反射就必须先从「正」开始解释. 一般情况下,我们使用某个类时必定知道它是什么类,是用来做什么的.于是我们直接对这个类进行实例化,之后使用这个 ...
- java反射方法_java反射之方法反射的基本操作方法
本文接上文"java反射之获取类的信息方法(推荐)",利用反射(invoke)来获取一个类中的方法来执行. 1.定义一个类,包含三个名称相同,参数不同的方法 class A{ pu ...
最新文章
- 程序员是复制粘贴的工具人?还是掌握“谜底”的魔术师?
- Pandas数据处理实战:福布斯全球上市企业排行榜数据整理
- html中怎样引入外部字体文件路径,CSS引入外部字体
- 华为云服务器密码修改,华为云鲲鹏云服务器安装MySQL 5.7.30
- oracle数据库存储函数,Oracle数据库存储过程
- 5G 商用时,我们所处的智能城市会是什么样?
- java接口中的default_java8 通过反射执行接口的default方法
- 判断是否是ie浏览器 前端js_jquery判断是否为ie浏览器的方法
- 计算机基础课在护理专业中的应用,计算机基础教育在护理教育中的应用论文.doc...
- 泛娱乐出海走出水土不服,元宇宙社交诞生新机会!
- wps文字表格制作拼音田字格模板_用word2003表格快速制作拼音田字格的方法.doc
- 机器学习(一)协同过滤推荐算法
- Netscreen的岁月 from Sina
- ssim算法计算图片_OpenCV 实现图像结构相似度算法 (SSIM 算法)
- 感性电路电流计算_220和380V功率和电流计算知识。
- 谷歌Chrome浏览器保存网页为PDF
- 网易公开课 计算机专业课程
- MATLAB打不开,只在任务栏闪一下就无反应了怎么办?
- 智能语音识别--方案实现--具体过程
- 世界主要经济体历年GDP排名一览(前50强)
热门文章
- windows安装包删了会有影响吗_win7系统删除系统更新安装包的详细教程
- java分隔符 字符串_用Java构建带分隔符的字符串的最佳方法是什么?
- Java Double类shortValue()方法与示例
- 一文读懂MySQL查询语句的执行过程
- Redis夺命十二问,你能扛到第几问?
- python深拷贝,浅拷贝,赋值引用
- Mybatis中(#{ })模糊查询like(使用oracle的concat函数嵌套拼接SQL)
- 怎么查看linux网关,如何查看linux服务器网关
- 数据集_自动驾驶数据集
- linux container框架,理解和配置LinuxContainerExecutor