java反射的原理,作用
什么是反射,反射原理
Java反射的原理:java类的执行需要经历以下过程,
编译:.java文件编译后生成.class字节码文件
加载:类加载器负责根据一个类的全限定名来读取此类的二进制字节流到JVM内部,并存储在运行时内存区的方法区,然后将其转换为一个与目标类型对应的java.lang.Class对象实例
连接:细分三步
验证:格式(class文件规范) 语义(final类是否有子类) 操作
准备:静态变量赋初值和内存空间,final修饰的内存空间直接赋原值,此处不是用户指定的初值。
解析:符号引用转化为直接引用,分配地址
初始化:有父类先初始化父类,然后初始化自己;将static修饰代码执行一遍,如果是静态变量,则用用户指定值覆盖原有初值;如果是代码块,则执行一遍操作。
Java的反射就是利用上面第二步加载到jvm中的.class文件来进行操作的。.class文件中包含java类的所有信息,当你不知道某个类具体信息时,可以使用反射获取class,然后进行各种操作。
Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。总结说:反射就是把java类中的各种成分映射成一个个的Java对象,并且可以进行操作。
获取class的三种方式
先定义一个实体类Person:
Package reflex;
public class Person {//私有属性private String name = "Tom";//公有属性public int age = 18;//构造方法public Person() { }//私有方法private void say(){System.out.println("private say()...");}//公有方法public void work(){System.out.println("public work()...");}
}
获取class方法 (类 对象 Class)
//1、对象调用 getClass() 方法来获取,通常应用在:比如你传过来一个 Object
// 类型的对象,而我不知道你具体是什么类,用这种方法
Person p1 = new Person();
Class c1 = p1.getClass();
//2、类名.class 的方式得到,该方法最为安全可靠,程序性能更高
// 这说明任何一个类都有一个隐含的静态成员变量 class
Class c2 = Person.class;
//3、通过 Class 对象的 forName() 静态方法来获取,用的最多,
// 但可能抛出 ClassNotFoundException 异常
Class c3 = Class.forName("reflex.Person");
需要注意的是:一个类在 JVM 中只会有一个 Class 实例,即我们对上面获取的 c1,c2,c3进行 equals 比较,发现都是true。代码如下:
Class class1 = Person.class;Person person = new Person();Class class2= person.getClass();if(class1.equals(class2)){System.out.println("class1.equals(class2)");}
Class具有的部分方法如下:
getName():获得类的完整名字。
getFields():获得类的public类型的属性。
getDeclaredFields():获得类的所有属性。包括private 声明的和继承类
getMethods():获得类的public类型的方法。
getDeclaredMethods():获得类的所有方法。包括private 声明的和继承类
getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。
getConstructors():获得类的public类型的构造方法。
getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。
newInstance():通过类的不带参数的构造方法创建这个类的一个对象。
Class能实现的功能
1判断对象属于哪个类
Person person = new Person();
Class class2= person.getClass();
System.out.println("class2:"+class2);
输出:class2:class reflect.Person
2获取类信息
Class class1 = Person.class;
Method[] methods = class1.getMethods();
Method[] declaredMethods = class1.getDeclaredMethods();
Field[] declaredFields = class1.getDeclaredFields();
3构建对象
Person person = new Person();
Class class2= person.getClass();
Object o = class2.newInstance();
//强转前先用instanceof判断
if(o instanceof Person){
((Person) o).work();
}
4动态执行方法
Class class1 = Person.class;
Method work = class1.getDeclaredMethod("work");
Person person = new Person();
work.invoke(person);
5动态操作属性
Class class1 = Person.class;
Person person = new Person();
Field field = class1.getDeclaredField("age");
//age默认值是18
field.set(person,22);
System.out.println(person.age);
6动态代理
可以参考:https://blog.csdn.net/h2604396739/article/details/83096696
jdk源码对反射的使用实例
LongAdder中,运用反射获取某属性的偏移值,方便Unsafe类直接获取某属性的值
// Unsafe mechanics Unsafe相关的初始化
private static final sun.misc.Unsafe UNSAFE;
private static final long valueOffset;
static {
try {
UNSAFE = sun.misc.Unsafe.getUnsafe();
Class<?> ak = Cell.class;
// 获取类中属性的偏移值
valueOffset = UNSAFE.objectFieldOffset (ak.getDeclaredField("value"));
} catch (Exception e) {
throw new Error(e);
}
}
final boolean cas(long cmp, long val) {
return UNSAFE.compareAndSwapLong(this, valueOffset, cmp, val);
}
什么时候应该使用反射?
1)反射构建出无法直接访问的类:例如可以把完整的包+类名称放到properties中,java中获取,然后就可以根据这个配置获取class了,然后你就可以干很多事
Class.forName("name");
2)调用不可访问的方法
如你想让单例变得不单例,可参考:https://blog.csdn.net/h2604396739/article/details/83825148
3)简化代码
参考:https://blog.csdn.net/h2604396739/article/details/83825148
java反射的原理,作用相关推荐
- java反射原理三种,java反射的原理、作用
1.什么是反射,反射原理java反射的原理:java类的执行需要经历以下过程,编译:.java文件编译后生成.class字节码文件 加载:类加载器负责根据一个类的全限定名来读取此类的二进制字节流到JV ...
- java反射原理_java反射原理是什么?java反射机制原理详解
前面给大家介绍了一下什么是java反射机制,那么下面要给大家介绍的就是java反射机制的原理,那么它的原理究竟是怎样的呢?下面就通过下面来做一下详细的了解吧. 首先我们再来介绍一下java反射机制. ...
- java反射机制原理,为什么需要反射,反射的作用
最近在学java反射以及动态代理,好多博客都写的十分官方.就自己整合些资料.加深java反射机制的理解. 在说反射之前,我们要先了解动态语言和静态语言的概念: 动态类型语言 所谓动态类型语言,就是类型 ...
- java反射原理三种,Java反射的原理,作用
什么是反射,反射原理 java类的执行需要经历以下过程 编译:.java文件编译后生成.class字节码文件 加载:类加载器负责根据一个类的全限定名来读取此类的二进制字节流到JVM内部,并存储在运行时 ...
- java 反射机制原理 简述
什么是反射机制? 1.在运行状态中,对于任意一个类,都能够知道这个类的属性和方法. 2.对于任意一个对象,都能够调用它的任何方法和属性.这种动态获取信息以及动态调用对象的方法的功能称为JAVA的反射. ...
- java反射机制原理详解_java反射机制的详细讲解
一 , 什么是java反射机制? JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象 ...
- java反射机制原理
JAVA基础--JAVA中的反射机制详解 //:面试题??原理; JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调 ...
- Java反射底层原理以及应用
写在前面: Java反射, 这个东西百度就会出来相关概念: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动 ...
- java反射的原理_java反射机制的实现原理
java反射机制的实现原理 反射机制: 所谓的反射机制就是java语言在运行时拥有一项自观的能力. 通过这种能力可以彻底的了解自身的情况为下一步的动作做准备. 下面具体介绍一下java的反射机制.这里 ...
最新文章
- JAVA CLASSPATH 和PATH的区别 经典
- 直播预告 | 双边分支网络BBN:攻坚长尾分布的现实世界任务
- Linux 命令之 file 命令-识别文件类型
- com技术内幕 代码_CFan科学院:零门槛极速抠图技术探秘
- 前端学习(3146):react-hello-react之getBeforeUpdate
- LeetCode 397. 整数替换(递归 贪心)
- Alpha冲刺 - (4/10)
- 2016年6月 之 《设计模式》
- python tkinter button_Python3 Tkinter-Button
- springcloud与springcloudalibaba版本对应关系
- linux i350网卡,intel I350 网卡驱动安装方法
- 计算机ps相框怎么做,教你用PS给相片加上很漂亮的相框
- mysql indentify_Database 中 identify relationship 和 non-identify relationship的区别
- 六轴机器人直角坐标系建立_知识篇-六轴机器人坐标
- 联想y7000p win10alt+tab卡顿解决方法
- rjs peepcode 笔记
- (附源码)计算机毕业设计SSM智慧灭火器管理系统
- 现实版终结者?杀手机器人预计2017年问世
- 代理模式之jdk动态代理的实现
- 2019年DevOps发展的五大趋势