java反射更改方法内容_Java反射
类的加载
java运行的都是类
当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现这个类进行初始化。
加载
加载,是指Java虚拟机查找字节流(查找.class文件),并且根据字节流创建java.lang.Class对象的过程。这个过程,将类的.class文件中的二进制数据读入内存,放在运行时区域的方法区内。然后在堆中创建java.lang.Class对象,用来封装类在方法区的数据结构。
类加载阶段:
(1)Java虚拟机将.class文件读入内存,并为之创建一个Class对象。
(2)任何类被使用时系统都会为其创建一个且仅有一个Class对象。
(3)这个Class对象描述了这个类创建出来的对象的所有信息,比如有哪些构造方法,都有哪些成员方法,都有哪些成员变量等。
连接
链接包括验证、准备以及解析三个阶段。
验证阶段:主要的目的是确保被加载的类(.class文件的字节流)满足Java虚拟机规范,不会造成安全错误。
准备阶段:负责为类的静态成员分配内存,并设置默认初始值。
解析阶段:将类的二进制数据中的符号引用替换为直接引用。
说明:
符号引用。即一个字符串,但是这个字符串给出了一些能够唯一性识别一个方法,一个变量,一个类的相关信息。
直接引用。可以理解为一个内存地址,或者一个偏移量。比如类方法,类变量的直接引用是指向方法区的指针;而实例方法,实例变量的直接引用则是从实例的头指针开始算起到这个实例变量位置的偏移量。
举个例子来说,现在调用方法hello(),这个方法的地址是0xaabbccdd,那么hello就是符号引用,0xaabbccdd就是直接引用。
在解析阶段,虚拟机会把所有的类名,方法名,字段名这些符号引用替换为具体的内存地址或偏移量,也就是直接引用。
初始化
初始化,则是为标记为常量值的字段赋值的过程。换句话说,只对static修饰的变量或语句块进行初始化。
如果初始化一个类的时候,其父类尚未初始化,则优先初始化其父类。
如果同时包含多个静态变量和静态代码块,则按照自上而下的顺序依次执行。
类的初始化时机
1.创建类的实例
2.使用类的静态变量,或者为静态变量赋值
3.调用类的静态方法
4.使用反射强制创建某个类或接口对应的java.lang.Class对象
5.初始化某个类的子类
6.直接运行某个类
类的加载器
BootStrapLoader(根类加载器)
用来加载java的核心类,比如System,String等。这些类在jre的lib目录下rt.jar中
ExtClassLoader(扩展类加载器)
负责jre的扩展目录中的jar包加载,这些类在jre的lib目录下的ext中
AppClassLoader(系统类加载器)
负责在JVM启动时加载来自Java命令的class文件,以及classpath环境变量所制定的jar包和类路径。
加载程序员自己写的类
反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
获取字节码文件对象(Class)的三种方式
1.Object中的getClass方法来获取Class对象
Object obj=new Proson();
Class clazz1 =obj.getClass();
2.直接通过 类名.class来获取Class对象
Class clazz2=Proson.class;
3.通过Class 对象的forName()静态方法来获取Class对象
Class clazz3 = Class.forName("com.xiaoli.bean.Proson");
一个类在 JVM 中只会有一个 Class 实例
泛型擦除
编译后产生的.class文件没有泛型约束,这种现象称为泛型擦除
反射展示泛型擦除效果
ArrayList arr = new ArrayList();
arr.add("a");
//反射获取ArrayList类的class文件对象
Class c = arr.getClass();
Method method = c.getMethod("add",object.class);
//实现向String类型的ArrayList中加入整型
method.invock(array,1)
通过配置文件更改运行内容
public class Person {
public void eat(){
System.out.println("人在吃饭");
}
}
public class Student {
public void study(){
System.out.println("学生在学习");
}
}
public class Worker {
public void job(){
System.out.println("上班族在工作");
}
}
public class Test {
public static void main(String[] args) throws Exception{
//IO流读取配置文件
FileReader r = new FileReader("config.properties");
//创建集合对象
Properties pro = new Properties();
//调用集合方法load,传递流对象
pro.load(r);
r.close();
//通过键获取值
String className = pro.getProperty("className");
String methodName = pro.getProperty("methodName");
//反射获取指定类的class文件对象
Class c = Class.forName(className);
Object obj = c.newInstance();
//获取指定的方法名
Method method = c.getMethod(methodName);
method.invoke(obj);
}
}
配置文件:
className=cn.itcast.demo3.Student
methodName=study
className=cn.itcast.demo3.Person
methodName=eat
className=cn.itcast.demo3.Worker
methodName=job
使用时注释掉不需要的即可
java反射更改方法内容_Java反射相关推荐
- java 反射 获取方法列表_Java 反射获取类详细信息的常用方法汇总
为了加深印象,特把方法都从新敲了一遍,等不会的时候返回了看看就好了. 类ReflectionDemo package Reflection; @Deprecated public class Refl ...
- javabean反射改字段内容_java反射机制给实体类相同字段自动赋值实例
一.封装一个工具类 1.简易版 package net.aexit.construct.acceptance.websky.utils; import java.lang.reflect.Field; ...
- java反射方法调用_Java反射(3)调用方法
目录: 1.访问方法(Method)对象的方法汇总 2.获取方法(Method)对象中的值 3.设置方法(Method)对象中的值 1.访问Method的方法汇总 以下四种方法在Class类可以返回关 ...
- java 获取参数的类型_java反射获取方法名称,参数类型
package com.mysec.reflex; import java.lang.reflect.Constructor; import java.lang.reflect.Field; impo ...
- java 反射 慢在那里_Java 反射到底慢在哪?
反射具体是怎么影响性能的?这引起了我的反思. 是啊,在阐述某个观点时确实有必要说明原因,并且证明这个观点是对的,虽然反射影响性能人尽皆知,我曾经也真的研究过反射是否存在性能问题,但并没有在写文章的时候 ...
- java反射的编译过程_Java反射机制小结和实际操作
一.什么是反射 1.编译和运行 在了解什么是Java反射机制前,先聊聊Java的编译和运行. 还记得第一次使用记事本编写第一个Java程序的场景吗?通过命令窗口,使用javac命令编译一个.java文 ...
- java 获取接口的注解_java反射注解妙用-获取所有接口说明
前言 最近在做项目权限,使用shiro实现restful接口权限管理,对整个项目都进行了重构.而权限管理需要用到所有的接口配置,包括接口url地址,接口唯一编码等.想要收集所有的接口信息,如果工程接口 ...
- java反射为什么消耗资源_Java反射笔记
第一:先认识Class类 类也是一种实例,类的实例创建有三种方式. 类的实例对象创建的方式有两种.以下的代码详细的介绍: packagecom.company;import java.util.*;p ...
- java 反射机制详解_java反射机制原理详解
反射机制:所谓的反射机制就是java语言在运行时拥有一项自观的能力.通过这种能力可以彻底的了解自身的情况为下一步的动作做准备.下面具体介绍一下java的反射机制.这里你将颠覆原来对java的理解. J ...
最新文章
- R语言将dataframe数据从宽表(wide)变为长表(long)实战:tidyr包的gather函数、cdata包的unpivot_to_blocks函数、data.table使用melt函数
- NLP-Progress记录NLP最新数据集、论文和代码: 助你紧跟NLP前沿
- 做技术的为什么很难发财?
- 标杆徐2018 Linux自动化运维实战,标杆徐2018 Linux自动化运维系列⑦: SaltStack自动化配置管理实战...
- 月薪20k的web前端开发程序员,他们都会的这6招
- 【2012百度之星资格赛】J:百度的新大厦
- pycharm中同时注释多行代码
- Javascript模块化编程(转自阮一峰的网络日志)
- Hadoop KMS 透明加密配置以及测试
- 微信安卓客户端逆向分析
- 网络工程师笔记--广域网和接入网
- vlan绑定_华为S5700交换机设置IP-MAC绑定功能
- conenct的用法(2种方法)
- Arduino 各种模块篇 震动模块 常开 震动传感器模块
- React集成react-activation,实现页面缓存
- 网秦手机杀毒软件 v2.1 symbian uiq 是什么
- Power BI----认识Power BI
- 【定量分析、量化金融与统计学】统计推断基础(2)---样本均值分布、中心极限定理、正态分布
- egg.js框架的基本设置 及 使用
- CMMI的五个等级是什么?
热门文章
- 苹果 python蚂蚁森林自动收能量_GitHub - dxp432/adb_python_alipay_AntForest: 蚂蚁森林自动收取能量、偷取能量、浇水(使用adb、python)...
- c语言应用程序的开发步骤,C语言如何开发桌面GUI应用程序?
- 模拟hibernate的注解来创建数据表,内置注解
- 2022年NOC大赛创客智慧编程赛道图形化scratch初赛题,包含答案解析
- NullPointException空指针异常相关及预防办法
- QML控件类型:Dial
- Vue的父组件调用子组件方法
- 淘宝短视频APP鹿刻上线 阿里能打造出导购版的抖音吗?
- Java私有成员可以被子类继承
- 一些生活和工作的小感悟