玩转java反射
玩玩JAVA反射
什么是反射
- Java反射机制是在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法;对于任何一个对象,都能够调用它的任何一个方法和属性;这样动态获取新的以及动态调用对象的方法的功能就叫做反射。
- 简单来说反射就是解剖一个类,然后获取这个类中的属性和方法,前提是要获取这个类的Class对象。
- 在java中,给我们提供几个类用于描述编译后的对象
|
类 |
描述 |
|
java.lang.Class |
描述编译后的class文件的对象 |
|
java.lang.reflect.Constructor |
用于描述构造方法 |
|
java.lang.reflect.Field |
描述字段(成员变量) |
|
java.lang.reflect.Method |
描述成员方法 |
如何使用反射
1、使用Class类,获取出被解剖的这个类的class文件对象
2、使用Class类方法,获取出类中的所有成员
3、将成员获取出来后,交给对应类,对应类中的方法,运行成员
如何获取class文件对象
- 使用类的对象获取
调用Object类的getClass() 方法,obj.getClass()
- 使用类的静态属性获取
ClassName.class
- 使用Class类的静态方法获取
Class.forName("类名");
不管用哪种方式获取的Class对象,他们都是相等的。
获取类对象
- 获取Field
Class cls = xxx.class;
Field[] fields1 = cls.getFields();//获取Class对象里面所有public的成员变量
Field[] fields2 = cls.getDeclaredFields();//获取Class对象中所有的成员变量
Field field1 = cls.getField("a");//获取Class对象中名字为 a 的成员变量
Field field2 = cls.getDeclaredField("b");//获取Class对象中名字为 b 的成员变量
- 获取Method
Class cls = xxx.class;
Method[] methods = cls.getMethods(); //获取Class对象里面所有public的方法
Method[] declaredMethods = cls.getDeclaredMethods(); //获取Class对象里面所有public的方法
Method[] method1 = cls.getMethod("method"); //获取Class对象里面所有public的方法
Method declaredMethod1 = cls.getDeclaredMethod(""); //获取Class对象里面所有public的方法
- 获取构造函数
Constructor[] constructors = cls.getConstructors(); //获取所有public构造函数
Constructor[] declaredConstructors = cls.getDeclaredConstructors(); //获取所有构造函数,包括private构造函数
Constructor constructor = cls.getConstructor(String.class); //获取指定参数public构造函数
Constructor declaredConstructor = cls.getDeclaredConstructor(Integer.class); //获取指定参数的构造函数,也可以private
修改Field
对于private的属性,必须设置 accessible 为 true 的时候才可以设置,否则会抛出 java.lang.IllegalAccessException 异常。
Field field = xxx;
//private field 需要设置 accessible
//field.setAccessible(true);
//obj是对象,value是要设置的值
field.set(obj,value);
调用方法
对于private的方法,必须设置 accessible 为 true 的时候才可以设置,否则会抛出 java.lang.IllegalAccessException 异常。
Method method = xxx;
//private 方法需要设置 accessible
//method.setAccessible(true);
//obj为对象,param1,param2 为参数,当方法无参时,直接调用 method.invoke(obj); 即可
method.invoke(obj,param1,param2...)

玩转java反射的更多相关文章
- java反射原来是这么玩的(反射一开,谁都不爱)
反射的发展历史 1996年01月23日,jdk 1.0版本发布,代号为Oak(橡树). 这个代号为Oak(橡树)的版本,在发布后的第二年,1997年02月19日,发布jdk 1.1版本,这次版本发布中 ...
- Java反射探索研究(转)
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankakay 摘要:本文详细深入讲解是Java中反射的机制,并介绍了如何通过反射来生成对象.调用函数.取得 ...
- Java反射机制demo(七)—反射机制与工厂模式
Java反射机制demo(七)—反射机制与工厂模式 工厂模式 简介 工厂模式是最常用的实例化对象模式. 工厂模式的主要作用就是使用工厂方法代替new操作. 为什么要使用工厂模式?直接new不好吗? 直 ...
- 8千字干货教程|java反射精讲
java反射机制精讲 目录 1. 反射机制的概念 2. 反射的基础Class类 3. 反射的用法 4. 反射的应用示例 作者简介:全栈学习笔记,一个正在努力的人 微信公众号:公众号日更,精彩美文每天推 ...
- 第28章 java反射机制
java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...
- Java反射机制
Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射: 静态编译:在编译时确定类型,绑定对象,即通过 ...
- java反射(基础了解)
package cn.itcast_01; /** *Person类 */ public class Person { /** 姓名 */ private String name; ...
- java基础知识(十一)java反射机制(上)
java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...
- java基础知识(十一)java反射机制(下)
1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...
随机推荐
- VS中的生成和重新生成的区别
2019独角兽企业重金招聘Python工程师标准>>> 生成 在上次编译的基础上,只对改动过的文件重新生成,没有改动过的文件不会重新生成. 重新生成 对所有的文件都重新生成.如果引用 ...
- The Preliminary Contest for ICPC Asia Xuzhou 2019 徐州网络赛 D Carneginon
Carneginon was a chic bard. But when he was young, he was frivolous and had joined many gangs. Recen ...
- Makefile中的CFLAGS,LDFLAGS,LIBS
CFLAGS:C编译器选项,而CXXFLAGS表示C++编译器的选项 1. CFLAGS参数 选项 说明 -c 用于把源码编译成.o对象文件,不进行链接过程 -o 用于连接生成可执行文件,在其后可以指 ...
- 11.秋招复习简单整理之什么是ICMP协议,ICMP协议的功能是什么?
ICMP即 InternetControlMessageProtocol,是网络控制报文协议.它是TCP/IP协议族的一个子协议,用于在IP主机.路由器之间传递控制消息.控制消息指网络通不通.主机是否 ...
- muduo网络库源码学习————无界队列和有界队列
muduo库里实现了两个队列模板类:无界队列为BlockingQueue.h,有界队列为BoundedBlockingQueue.h,两个测试程序实现了生产者和消费者模型.(这里以无界队列为例,有界队 ...
- muduo网络库源码学习————原子性操作Atomic.h
原子性操作可以做到比互斥锁更小的开销,在多线程编程中原子性操作是非常有用的.Atomic.h文件位于muduo/base下,代码如下: // Use of this source code is go ...
- AWS bind: cannot assign requested address
最近在AWS上安装Redis,遇到一个坑. Redis默认配置文件中有个bind配置项,默认为127.0.0.1.此时只能在服务器内部访问Redis. 为了从服务器外部访问Redis,我给bind添加 ...
- Android | 带你零代码实现安卓扫码功能
目录 小序 背景介绍 前期准备 开始搬运 结语 小序 这是一篇纯新手教学,本人之前没有任何安卓开发经验(尴尬),本文也不涉及任何代码就可以使用一个扫码demo,华为scankit真是新手的福音-- ...
- C. Cave Painting(最小公倍数的应用)
\(\color{Red}{网上的题解都是投机取巧啊,虽然也没错}\) \(Ⅰ.先说一下投机取巧的方法\) \(自己写几个例子会发现k很小的时候满足条件的n就变得很大\) \(所以我们直接暴力从1判断 ...
- maven项目变成web项目
具体步骤如图所示: 第一步:建议一个Maven Webapp项目 第二步:右击项目,选择属性,找到project facets,点击tuntimes标签选择apache tomcat v6.0选中P ...