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 反射相关推荐

  1. java 反射 内存_Java内存到反射入门

    Java内存到反射入门(一) 初识Java内存 平常我们最常提到的的JAVA分区是这三个分区 其中方法区是一个特殊的堆,功能如图上所示. 初识反射:框架设计的灵魂 反射的功能:将类的各个组成部分封装为 ...

  2. java 反射机制_Java反射机制原理探究

    反射是Java中的一个重要的特性,使用反射可以在运行时动态生成对象.获取对象属性以及调用对象方法.与编译期的静态行为相对,所有的静态型操作都在编译期完成,而反射的所有行为基本都是在运行时进行的,这是一 ...

  3. java 反射练习_JAVA反射的基础学习

    反射 :reflection 程序的一种内省机制 程序可以在运行期间动态的创建对象,获取对象类型,调用对象行为 内省机制在java和.net语言中有,在早期的C,C++,delphi,vb这些语言都没 ...

  4. java反射类型转换_java反射(转)

    反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)) 一.反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道 ...

  5. java 反射代价_Java反射机制

    # 反射 ## 什么是反射 反射是Java提供的动态执行机制, 可以动态加载类, 动态创建对象, 动态访问属性, 动态调用方法.. 静态执行: Java代码经过编译以后就确定的执行次序, 称为静态执行 ...

  6. java反射模式_Java反射机制详解

    对于一般的开发者,很少需要直接使用Java反射机制来完成功能开发,但是反射是很多框架譬如 Spring, Mybatis 实现的核心,反射虽小,能量却很大. 本文主要介绍反射相关的概念以及API的使用 ...

  7. Java的反射作用_java反射机制的作用与优点

    java的反射机制就是增加程序的灵活性,避免将程序写死到代码里, 例如: 实例化一个 person()对象, 不使用反射, new person(); 如果想变成 实例化 其他类, 那么必须修改源代码 ...

  8. java映射理解_Java反射的理解

    Java反射的理解 反射之中包含了一个「反」字,所以想要解释反射就必须先从「正」开始解释. 一般情况下,我们使用某个类时必定知道它是什么类,是用来做什么的.于是我们直接对这个类进行实例化,之后使用这个 ...

  9. java反射方法_java反射之方法反射的基本操作方法

    本文接上文"java反射之获取类的信息方法(推荐)",利用反射(invoke)来获取一个类中的方法来执行. 1.定义一个类,包含三个名称相同,参数不同的方法 class A{ pu ...

最新文章

  1. 程序员是复制粘贴的工具人?还是掌握“谜底”的魔术师?
  2. Pandas数据处理实战:福布斯全球上市企业排行榜数据整理
  3. html中怎样引入外部字体文件路径,CSS引入外部字体
  4. 华为云服务器密码修改,华为云鲲鹏云服务器安装MySQL 5.7.30
  5. oracle数据库存储函数,Oracle数据库存储过程
  6. 5G 商用时,我们所处的智能城市会是什么样?
  7. java接口中的default_java8 通过反射执行接口的default方法
  8. 判断是否是ie浏览器 前端js_jquery判断是否为ie浏览器的方法
  9. 计算机基础课在护理专业中的应用,计算机基础教育在护理教育中的应用论文.doc...
  10. 泛娱乐出海走出水土不服,元宇宙社交诞生新机会!
  11. wps文字表格制作拼音田字格模板_用word2003表格快速制作拼音田字格的方法.doc
  12. 机器学习(一)协同过滤推荐算法
  13. Netscreen的岁月 from Sina
  14. ssim算法计算图片_OpenCV 实现图像结构相似度算法 (SSIM 算法)
  15. 感性电路电流计算_220和380V功率和电流计算知识。
  16. 谷歌Chrome浏览器保存网页为PDF
  17. 网易公开课 计算机专业课程
  18. MATLAB打不开,只在任务栏闪一下就无反应了怎么办?
  19. 智能语音识别--方案实现--具体过程
  20. 世界主要经济体历年GDP排名一览(前50强)

热门文章

  1. windows安装包删了会有影响吗_win7系统删除系统更新安装包的详细教程
  2. java分隔符 字符串_用Java构建带分隔符的字符串的最佳方法是什么?
  3. Java Double类shortValue()方法与示例
  4. 一文读懂MySQL查询语句的执行过程
  5. Redis夺命十二问,你能扛到第几问?
  6. python深拷贝,浅拷贝,赋值引用
  7. Mybatis中(#{ })模糊查询like(使用oracle的concat函数嵌套拼接SQL)
  8. 怎么查看linux网关,如何查看linux服务器网关
  9. 数据集_自动驾驶数据集
  10. linux container框架,理解和配置LinuxContainerExecutor