java反射原理三种,Java反射的原理,作用
什么是反射,反射原理
java类的执行需要经历以下过程
编译:.java文件编译后生成.class字节码文件
加载:类加载器负责根据一个类的全限定名来读取此类的二进制字节流到JVM内部,并存储在运行时内存区的方法区,然后将其转换为一个与目标类型对应的java.lang.Class对象实例
连接:细分三步
验证:格式(class文件规范) 语义(final类是否有子类) 操作
准备:静态变量赋初值和内存空间,final修饰的内存空间直接赋原值,此处不是用户指定的初值。
解析:符号引用转化为直接引用,分配地址
初始化:有父类先初始化父类,然后初始化自己;将static修饰代码执行一遍,如果是静态变量,则用用户指定值覆盖原有初值;如果是代码块,则执行一遍操作。
什么是反射:
Java的反射就是利用上面第二步加载到jvm中的.class文件来进行操作的。.class文件中包含java类的所有信息,当你不知道某个类具体信息时,可以使用反射获取class,然后进行各种操作。
Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性
要想解剖一个类,必须先要获取到该类的字节码文件对象(class)。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.)
关于class对象和这个Class类
Class对象的由来是将class文件读入内存,并为之创建一个Class对象
Class类
class类 :代表一个类,是Java反射机制的起源和入口
用于获取与类相关的各种信息, 提供了获取类信息的相关方法
Class类继承自Object类
Class类是所有类的共同的图纸
每个类有自己的对象,同时每个类也看做是一个对象,有共同的图纸Class,存放类的结构信息,能够通过相应方法取出相应的信息:类的名字、属性、方法、构造方法、父类和接口。
获取class对象(反射入口)的三种方式
要想操作反射,必须先拿到反射的入口
1,通过通过Class.forName("全类名") 静态方法来获取,用的最多
Class c3 = Class.forName("reflect_fanshe.Person");
Class> perClazz = Class.forName("reflect_fanshe.Person");
2,类名.class
类名.class 的方式得到,该方法最为安全可靠,程序性能更高
// 这说明任何一个类都有一个隐含的静态成员变量 class
Class c2 = Person.class;
Class> perClazz2 = Person.class;
3,对象.getClass()
Person person = new Person();
Class> perClazz3 = person.getClass();
Class具有的部分方法如下:
getName():获得类的完整名字。
getFields():获得类的public类型的属性。
getDeclaredFields():获得类的所有属性。包括private 声明的和继承类
getMethods():获得类的public类型的方法。
getDeclaredMethods():获得类的所有方法。包括private 声明的和继承类
getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。
getConstructors():获得类的public类型的构造方法。
getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。
newInstance():通过类的不带参数的构造方法创建这个类的一个对象。
通过反射获取对象的实例,并操作对象
1,class.newInstance() ,并强转类型,然后就可以操作对象了,主要是调用方法。
2,操作属性,可以操作类里面的public属性和private属性 如果属性是private,正常情况下是不允许外界操作属性值,这里可以用Field类的setAccessible(true)方法,暂时打开操作的权限
反射方法的使用之---通过反射运行配置文件内容
student类:
public class Student {
public void show() {
System.out.println("is show()");
}
}
配置文件以txt文件为例子(pro.txt):
className = cn.fanshe.Student
methodName = show
测试类:
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Properties;
/* * 我们利用反射和配置文件,可以使:应用程序更新时,对源码无需进行任何修改
* 我们只需要将新类发送给客户端,并修改配置文件即可 */
public class Demo {
public static void main(String[] args) throws Exception { //通过反射获取Class对象
Class stuClass = Class.forName(getValue("className"));//"cn.fanshe.Student" //2获取show()方法
Method m = stuClass.getMethod(getValue("methodName"));//show //3.调用show()方法
m.invoke(stuClass.getConstructor().newInstance());
}
//此方法接收一个key,在配置文件中获取相应的value
public static String getValue(String key) throws IOException{
Properties pro = new Properties();//获取配置文件的对象
FileReader in = new FileReader("pro.txt");//获取输入流
pro.load(in);//将流加载到配置文件对象中
in.close();
return pro.getProperty(key);//返回根据key获取的value值
}
}
控制台输出:is show()
需求:
当我们升级这个系统时,不要Student类,而需要新写一个Student2的类时,这时只需要更改pro.txt的文件内容就可以了。代码就一点不用改动
新写一个student2的类:
public class Student2 {
public void show2() {
System.out.println("is show2()");
}
}
配置文件更改为:
className = cn.fanshe.Student2
methodName = show2
控制台输出:is show2()
java反射原理三种,Java反射的原理,作用相关推荐
- java反射原理三种,java反射的原理、作用
1.什么是反射,反射原理java反射的原理:java类的执行需要经历以下过程,编译:.java文件编译后生成.class字节码文件 加载:类加载器负责根据一个类的全限定名来读取此类的二进制字节流到JV ...
- Java的三种代理模式简述
本文着重讲述三种代理模式在java代码中如何写出,为保证文章的针对性,暂且不讨论底层实现原理,具体的原理将在下一篇博文中讲述. 代理模式是什么 代理模式是一种设计模式,简单说即是在不改变源码的情况下, ...
- Java的三种代理模式完整源码分析
Java的三种代理模式&完整源码分析 Java的三种代理模式&完整源码分析 参考资料: 博客园-Java的三种代理模式 简书-JDK动态代理-超详细源码分析 [博客园-WeakCach ...
- Java的三种代理模式【附源码分析】
Java的三种代理模式&完整源码分析 代理模式分为两种,静态代理和动态代理,动态代理包括JDK动态代理和Cglib动态代理. 静态代理 静态代理在使用时,需要定义接口或者父类,被代理对象与代理 ...
- java单例模式 三种_三种java单例模式概述
在java语言的应用程序中,一个类Class只有一个实例存在,这是由java单例模式实现的.Java单例模式是一种常用的软件设计模式,java单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种.下 ...
- Java的三种程序基本结构
Java三种程序基本结构 今天我们了解下Java的三种程序基本结构 理解什么是基本结构 主要分为 :1. 顺序结构 2. 选择结构 3. 循环结构 一丶顺序结构 顺序结构就是程序从上到下一行一行的执行 ...
- java的三种技术架构
Java的三种技术架构: JAVAEE:Java Platform Enterprise Edition,开发企业环境下的应用程序,主要针对web程序开发: JAVASE:Java Platform ...
- JAVA爬虫三种方法
文章目录 前言 一.JDK 二.HttpClient 三.Jsoup 总结 前言 记录JAVA爬虫三种方式 一.JDK 使用JDK自带的URLConnection实现网络爬虫. public void ...
- java jar 打印_三种Java打印PDF文档的实例代码
以下内容归纳了通过Java程序打印PDF文档时的3种情形.即: 1 静默打印 2 显示打印对话框打印 3 打印PDF时自定义纸张大小 使用工具:Spire.PDF for Java Jar文件获取及导 ...
最新文章
- linux下的重要服务dns
- pyhton 中的字符串切片问题
- linux规则及别名设置
- 带通采样定理简单记录
- python在线课程-开始网上在线深度学习python课程
- c语言程序设计1.9例题
- 第三百八十九节,Django+Xadmin打造上线标准的在线教育平台—列表筛选结合分页...
- boost::sort模块实现相关的浮点排序测试
- NOIP2007 count 统计数字
- js 控制文件名与文件大小
- 上海消保委评饿了么“多等5分钟”功能:逻辑上有问题
- 【js高级程序设计】迭代器
- 拓端tecdat|matlab预测ARMA-GARCH 条件均值和方差模型
- Google发布Java 核心工具库——Guava 28.0
- DM642图像处理程序的主要结构
- oracle数据存入临时表,ORACLE数据库临时表总结
- 房产经纪人拿楼市新政炒作涨价
- 自定义video的controls(播放暂停按钮、进度条、快进快退等)
- 相约2021,回首2020 | 我在CSDN的年度总结
- 01_摄像头基础知识
热门文章
- 买笔记本的10大愚蠢表现
- BCH能达到它的宣传吗?现实世界压力测试即将到来!
- Elk5安装X-Pack
- Salesforce平台支持多租户Multi tenant的核心设计思路
- Python实现拉格朗日插值法
- linux 安装java10
- [译][python]ImportError:attempted relative import with no known parent package
- python - DBUtils 连接池减少oracle数据库的连接数
- 搜索引擎选择: Elasticsearch与Solr
- 论前端工程师如何应对西电教学评估系统