JAVA 反射用法
1.获得Class对象
- Class<?> classType = Class.forName() 可以通过传入一个全限定类名(包含包名)返回一个该类的Class类对象引用 。
- Class<?> classType = object.getClass() 通过引用的到Class对象。
- Class<?> classType = Object.class 通过类字面常量获得,好处就是懒加载,只有使用时才会加载。
2.获得构造器
获得指定构造器
Constructor<T> getConstructor(Class<?>... parameterTypes)
parameterTypes 是 Class[ ] ,它里面的元素和元素顺序与构造器参数对应。
- Constructor constructor = getConstructor(new Class[ ] { } ),获得默认构造器。
- Constructor constructor = getConstructor(new Class[ ] {String.class, int.class}),获得参数为(String,int) 的构造器。
获得所有构造器
- Constructor[ ] constructor = classType.getConstructors()
3.获得字段
获得public字段
- Field field = classTypre.getField( String name ) ; 获得对应名称的字段,注意只能获得所有public字段,包括父类的public字段,其他权限的字段无法获得。
- Field[ ] fields = classTypre.getField() ; 获得所有public字段的数组。
获得自身字段
- Field field = classTypre.getDeclaredField( String name); 获得 当前类定义的字段,包括所有权限。不包括父类任何字段,哪怕是public。
- Field[ ] fields = classTypre.getDeclaredField() ; 获得所有字段的数组。
获得所有字段包括父类的字段
- getSuperClass()获得父类Class对象,getSuperClass()
- 循环调用 getSuperClass()和getDeclaredFields[ ],把Field放入List即可。
4.获得方法
获得public方法
- Method method= classTypre.getMethod ( String name ,Class<?>... parameterTypes) ; 根据方法签名的方法。
- name是方法名,parameterTypes是 Class [ ],用来获取方法参数的类型
- 注意只能获得所有public方法,包括父类的public字段,其他权限的字段无法获得。
- Method [ ] methods= classTypre.geMethods() ; 获得所有public方法。
- Method method= classTypre.getMethod ( String name ,Class<?>... parameterTypes) ; 根据方法签名的方法。
获得自身方法
- Method method= classTypre.getDeclaredMethod (String name ,Class<?>... parameterTypes);
- 获得 当前类定义的方法,包括所有权限。不包括父类任何方法,哪怕是public。
- Method [ ] methods= classTypre.getDeclaredMethods() ; 获得所有字段的数组。
- Method method= classTypre.getDeclaredMethod (String name ,Class<?>... parameterTypes);
获得所有字段包括父类的方法
- getSuperClass()获得父类Class对象,getSuperClass()
- 循环调用 getSuperClass()和getDeclaredMethods(),把Method放入List即可。
5.获取修改字段相关信息
- 反射只是通过Class对象获得方法和字段,要获取实例的字段就要传入一个具体的实例。
获取字段值
- Object value = field.get( Object obj) 通过get方法获得实例对象obj对应的field的值。
- 如果field是静态字段则可以直接使用get(null)获取值。
- 获取基本类型字段的值 : int value = field.get(Object obj) 获取int类型的字段。还有其他类型也是用同样的方法。
- private修饰的字段无法直接获得,必须先设置file.setAccessible(true) 才能访问
获取字段相关信息并通过Modifier解析修饰符
- Annotation<?> annotation = field.getAnnotation(Class<T> annotationClass) 返回字段上的指定注解
- Annotation[ ] annotations = field.getDeclaredAnnotations() 返回字段上的所有注解数组
- Class<?> type = field.getType() 返回 字段 的类型 的 Class对象。
- 通过Modifier静态方法判断是不是某一个权限修饰符,如Modifier.isPrivate(modifier)
- 再如:Modifier.isStatic(modifier) 判断是不是静态成员
- Modifier静态方法toString 返回权限标识符。
int modifier = field.getModifiers() 以int形式返回字段的修饰符。
设置修改字段值
- field.set( Object obj, Object value) 通过set方法设置实例对象obj对应的file字段的值为value。
- 设置基本类型字段的值 :field.set(Object obj,int value) 获取int类型的字段。还有其他类型也是用同样的方法。
- private修饰的字段无法直接设置,必须先设置field.setAccessible(true) 才能设置。
- 被final修饰的字段,可以通过反射临时修改值,但是不会把原始值修改了,所以final是绝对不可变的。
6.获取方法相关信息
- 和字段一样需要传入一个实例对象。
获取字段相关信息并通过Modifier解析修饰符
- Annotation<?> annotation = method.getAnnotation(Class<T> annotationClass) 返回方法上的指定注解
- Annotation[ ] annotations = method.getDeclaredAnnotations() 返回方法上的所有注解数组
- Class<?> type = field.getReturnType() 返回 方法返回值类型 的 Class对象。
- 通过Modifier静态方法判断是不是某一个权限修饰符,如Modifier.isPrivate(modifier)
- 再如:Modifier.isStatic(modifier) 判断是不是静态成员
- Modifier静态方法toString 返回权限标识符。
通过反射调用方法
- method.invoke(Object obj, Object... args) 传入实例对象obj和方法对应的参数。
- private修饰的方法无法反射,必须先设置method.setAccessible(true) 才能反射调用。
int modifier = method.getModifiers() 以int形式返回字段的修饰符。
7.创建实例对象其他办法
- 通过反射得来的构造器创建实例。
- 默认构造器创建对象。
Constructor<?> constructor = studentClass1.getConstructor(new Class[]{});
Student student1 = (Student)constructor.newInstance();也可以写成constructor.newInstance(new Object[ ] { })
- 带参构造器创建对象。
Constructor<?> constructor2 = studentClass1.getConstructor(new Class[]{int.class});
Student student2 = (Student)constructor2.newInstance(12);也可以写成constructor.newInstance(new Object[ ] { 12 })
- 默认构造器创建对象。
- 通过Class对象创建实例
Student student3 = Student.class.newInstance();
- 还有通过 new 、 反序列化、colon( ) 方法创建对象,Java中所以一共有5种方法创建实例对象。
JAVA 反射用法的更多相关文章
- 不藏了,这些Java反射用法总结都告诉你们
摘要:Java反射是一种非常强大的机制,它可以在同一个系统中去检测内部的类的字段.方法和构造函数.它非常多的Java框架中,都大量应用了反射技术,如Hibernate和Spring.可以说,反射机制的 ...
- Java之反射 — 用法及原理
Java之反射 - 用法及原理 定义 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象 ...
- java反射-- Field 用法实践
java 反射是一种常用的技术手段, 通过加载类的字节码的方式来获取相关类的一些信息 比如成员变量, 成员方法等. Field 是什么呢? field 是一个类, 位于java.lang.reflec ...
- java 反射 动态代理
在上一篇文章中介绍Java注解的时候,多次提到了Java的反射API.与javax.lang.model不同的是,通过反射API可以获取程序在运行时刻的内部结构.反射API中提供的动态代理也是非常强大 ...
- java反射机制 + Method.invoke解释 getMethod + 反射理解
功能: 通过读取另一个Dll去创建一个控件(Form,Button,TextBox,DataGridView),然后对当中一些属性进行检查. 创建控件的大致流程是,Assembly->Modul ...
- Java反射机制深度剖析
版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! Java反射机制是Java语言中一种很重要的机制,可能在工作中用到的机会不多,但是在很多框架中都有用到这种机制.我们知道Java是一门静态 ...
- Java反射机制剖析(一)-定义和API
1. 什么是Java反射机制 Java的反射机制是在程序运行时,能够完全知道任何一个类,及其它的属性和方法,并且能够任意调用一个对象的属性和方法.这种运行时的动态获取就是Java的反射机制.其 ...
- 如何提高使用Java反射的效率?
前言 在我们平时的工作或者面试中,都会经常遇到“反射”这个知识点,通过“反射”我们可以动态的获取到对象的信息以及灵活的调用对象方法等,但是在使用的同时又伴随着另一种声音的出现,那就是“反射”很慢,要少 ...
- 深入解析Java反射基础
博客原文:http://www.sczyh30.com/posts/Java/java-reflection-1/ - 这老哥写的特别好 一.回顾:什么是反射? 反射(Reflection)是Java ...
随机推荐
- Java 8新特性之lambda(八恶人-2)
Major Marquis Warren 沃伦·马奎斯少校 “Tring to get a couple of bounties in to Red Rock.”我想带几个通缉犯去红石镇 一.基本介绍 ...
- Fire Net HDU - 1045(二分匹配)
把每一列中相邻的 . 缩为一个点 作为二分图的左边 把每一行中相邻的 . 缩为一个点 作为二分图的右边 然后求最大匹配即可 这题用匈牙利足够了...然而..我用了hk...有点大材小用的感觉// ...
- 【刷题】BZOJ 4316 小C的独立集
Description 图论小王子小C经常虐菜,特别是在图论方面,经常把小D虐得很惨很惨. 这不,小C让小D去求一个无向图的最大独立集,通俗地讲就是:在无向图中选出若干个点,这些点互相没有边连接,并使 ...
- 【刷题】BZOJ 4059 [Cerc2012]Non-boring sequences
Description 我们害怕把这道题题面搞得太无聊了,所以我们决定让这题超短.一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的数字,即每个子序列里至少存在一个数字只出现一次.给定 ...
- 「NOI2018」你的名字
「NOI2018」你的名字 题目描述 小A 被选为了\(ION2018\) 的出题人,他精心准备了一道质量十分高的题目,且已经 把除了题目命名以外的工作都做好了. 由于\(ION\) 已经举办了很多届 ...
- 再谈Scala集合
集合!集合!一个现代语言平台上的程序员每天代码里用的最多的大概就是该语言上的集合类了,Scala的集合丰富而强大,至今无出其右者,所以这次再回过头再梳理一下. 本文原文出处: 还是先上张图吧,这是我 ...
- THUWC2019爆零记
Day -1 现在在机房里,准备敲敲板子什么的. 今天晚上放假诶,要好好睡一下.好好睡是不可能的,这辈子不可能的. Day 0 现在在酒店,\(lwh\)神仙在超越,我打了个\(treap\)的板子就 ...
- 学习5_STM32--外设通信方式
就拿stm32的外设spi来说,通信方式主要有3种 > spi常规收发方式 (在轮询机制下通过判断缓冲区空与非空作为收发依据) > spi中断收发方式 (在中断机制下收发数据 ...
- CF1012C Hills
显然的DP是,dp[i][j][val] val是1e6的 简化 发现,其实决策很有限,最优解的i-1的val选择有限 题解 这里的一个trick是,f[i][j][0]转移不考虑a[i]和a[i-1 ...
- easyui form 提交问题,纠结了很久,有点诡异
http://www.iteye.com/problems/131602 form 提交,后台运行有时慢,页面就不等后台数据的响应,直接alert("服务器维护中,请稍后再试!") ...