入门级 JAVA反射机制
1.什么是反射?
Java中的反射机制是Java语言的一个很重要的特性,是Java “动态性” 的重要体现。
Java反射机制让我们在程序运行状态中,对于任意一个类,都能知道这个类的所有属性和方法;对于任意一个对象,都能调用他的任意一个方法。这种动态获取属性以及动态调用对象方法的功能就是“Java的反射机制”。
2.反射机制的本质(A)
在使用一个类之前必须先加载它,而当虚拟机加载完一个类后,就会在方法区创建一个这个类对应的class对象(一个类只有一个class对象),这个对象包含了类完整的结构信息。这个对象就像一面镜子,通过他可以“看到”整个类的结构,因此很形象的被称为“反射”。“class对象”就是反射机制的核心。
3.java.lang.Class 类(A)
Class类实现反射(Reflection)的基础,任何想实现动态加载、运行的类都必须先获得其相应的Class对象。
java.lang.Calss类十分特殊,它表示java中的所有类型(类、接口、枚举、注解、数组、原始数据类型(基本数据类型)以及void)
Class类没有公共的构造器,Class对象由虚拟机自行创建。
4.Class对象获取方式:
1.运用 Class.froName(包名+类名); (常用)
2.运用 .class 语法
3.运用 getClass()方法
5.反射机制的常见操作
1.动态加载类,动态获取类的信息(属性、方法、构造器等)
2.动态构造对象
3.动态调用类和对象的方法
4.动态调用及处理属性
5.获取泛型信息
6.处理注解
6.常见操作涉及到的类
Class类 代表类的结构信息
Method类 代表方法的结构信息
Field类 代表属性的结构信息
Construction类 代表构造器的结构信息
Annotation类 代表注解的结构信息
7.Class类常用方法
1.getClassLoader() 返回类的类加载器。
2.getName() 返回class对象表示的实体的名称(包含包名)
3.getSimpleName() 返回class对象表示的实体的简单名称(不含包名)
4.newInstance() 创建此class对象表示的类的新对象。
获取属性(字段):
1.getField(String name) 返回一个 Field对象,反射class对象表示的类或接口的指定公共字段。
2.getFields() 返回一个Field数组对象,反射class对象表示的类或接口的所有可访问的公共字段 。
3.getDeclaredField(String name) 返回一个 Field对象,它反射此class对象表示的类或接口中指定的声明字段。
4.getDeclaredFields() 返回一个Field数组对象反射此class对象表示的类或接口中声明的所有字段。
获取方法:
1.getMethod(String name, 类<?>... 参数(列表)类型)
返回一个 Method对象,它反射此表示的类或接口的指定公共方法。
2.getMethods() 返回一个Method对象数组 反射class对象表示的类或接口中所有公共方法,包括那些由类或接口和那些从父类和父接口继承的方法。
3.getDeclaredMethod(String name, 类<?>... 参数(列表)类型)
返回一个 Method对象,它反射此表示的类或接口中声明的指定方法。
4.getDeclaredMethods()
返回一个Method对象数组 反射class对象表示的类或接口中声明的所有方法,包括公共,受保护,默认(包)访问和私有方法,但不包括继承的方法。
8.Field类常用方法
1.getName() 返回此 Field对象表示的字段的名称。
2.getType() 返回此 Field对象表示的字段的类型(class)
3.get(Object obj) 返回此Field对象所表示的字段的值 。
4.set(Object obj, Object value)
将指定对象参数上的此 Field对象表示的字段设置为指定的新值。
set方法无法直接访问private属性,需要“禁用安全检查”,即setAcceessible(true)。
5.getModifiers() 以整数形式(int)返回由该 Field对象表示的字段的Java语言修饰符
9.Method类常用方法
1.getName() 返回由此Method对象表示的方法的名称
2.getReturnType() 返回一个class对象,表示Method对象表示的方法的返回值类型。
3.getParameterTypes()
返回一个class对象的数组, 以声明顺序表示Method对象表示的方法的形式参数类型。
4.getModifiers() 返回Method对象表示的方法的修饰符
5.invoke(Object obj, Object... args) args 参数列表
调用指定对象的Method对象表示的方法 args为实参
入门级 JAVA反射机制的更多相关文章
- 第28章 java反射机制
java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...
- Java反射机制
Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射: 静态编译:在编译时确定类型,绑定对象,即通过 ...
- java基础知识(十一)java反射机制(上)
java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...
- java基础知识(十一)java反射机制(下)
1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...
- Java反射机制专题
·Java Reflection Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方 ...
- java反射机制深入详解
java反射机制深入详解 转自:http://www.cnblogs.com/hxsyl/archive/2013/03/23/2977593.html 一.概念 反射就是把Java的各种成分映射成 ...
- Java反射机制DOME
Java反射机制 public class TestHibernate { @Test public void TestHb(){ try { Class cs = Class.forName(&qu ...
- 反射——Java反射机制
反射概述 什么是反射? ① 反射的概念是由Smith在1982年首次提出的,主要指程序可以访问.检测和修改它本身状态或行为的一种能力. ② JAVA反射机制是在运行状态中,对应任意一个类,都能 ...
- Java反射机制可以动态修改实例中final修饰的成员变量吗?
问题:Java反射机制可以动态修改实例中final修饰的成员变量吗? 回答是分两种情况的. 1. 当final修饰的成员变量在定义的时候就初始化了值,那么java反射机制就已经不能动态修改它的值了. ...
随机推荐
- 简述Action+Service +Dao 功能
转载:http://blog.csdn.net/inter_peng/article/details/41021727 1. Action/Service/DAO简介: Action是管理业务(Ser ...
- Unity5 打assetbundle时,无法打成图集仍然是散图的原因
首先需要把 SpritePacker设置成可用 菜单Edit->project setting->editor 修改为可用 然后,保证所有图片的导入格式如下 最主要是 packi ...
- spring boot入门篇,helloworld案例演示
为什么用spring boot? 嵌入的 Tomcat,无需部署 WAR 文件 简化 Maven 配置 无需 XML 配置,轻松快速地搭建Spring Web应用 开始学习SpringBoot 构建简 ...
- 什么是web service ?
一.序言 大家或多或少都听过WebService(Web服务),有一段时间很多计算机期刊.书籍和网站都大肆的提及和宣传WebService技术,其中不乏很多吹嘘和做广告的成分.但是不得不承认的是Web ...
- PAT1046: Shortest Distance
1046. Shortest Distance (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue The ...
- SpringMVC--入门案例
一.SpringMVC介绍 SpringMVC和Struts都属于表现层框架, 是Spring的一部分,Spring的整体结构如下: 1.1 SpringMVC的处理流程 下图是SpringMVC的执 ...
- 关于java多线程关键字volatile的理解
volatile关键字的作用是强制从公共堆栈中取得变量的值,而不是从线程私有数据栈中取得变量的值. 使用volition关键字增加了实例变量在多个线程间的可见性.但volition有个致命的缺点就是不 ...
- Codeforces Round #483 (Div. 2)
题目链接: https://cn.vjudge.net/contest/229761 A题: n个数字,两个人轮流去数字,直到剩下最后一个数字为止,第一个人希望剩下的数字最小,第二个人希望数字最大,最 ...
- MySQL复制进阶
Ⅰ.背景 搭建MySQL复制环境非常简单 你的系统是否也是像我之前那么搭建的呢? 那么,你的复制系统是否出现过以下的情况呢? 复制报错,例如:1062,1032 主从数据不一致 Ⅱ.真正高可靠复制环境 ...
- Eclipse报错Resource '/.org.eclipse.jdt.core.external.folders/.link5' already exists.
Eclipse查看源码出现source not found,重新Build Path选择jdk的jar包时,出现Resource '/.org.eclipse.jdt.core.external.fo ...