java 反射机制01
java反射机制01
Table of Contents
1 反射机制
- 反射的概念是由Smith 在1982年首次提出的,主要是指程序可以访问、检测和修改它本 身状态或行为的一种能力。这一概念的提出很快引发了计算机科学领域关于应用反射性 的研究。它首先被程序语言的设计领域所采用,并在Lisp 和面向对象方面取得了成绩。 其中LEAD/LEAD++ 、OpenC++ 、MetaXa 和OpenJava 等就是基于反射机制的语言。
- 有时候我们说某个语言的动态性,会用使用一些术语,如动态绑定(dynamic binding)、动态链接(dynamic linking)、动态加载(dynamic loading)等,然而"动态" 一词其实没有绝对而普遍的严格定义,有时候甚至像面向对象当初被导入到编程领域一 样,一人一把号,各吹各的调。
- 一般而言,开发者群说到动态语言,大致认同的一个定义是:"程序运行时,允许改变程 序结构或变量类型,这种语言称为动态语言",从这个观点看,perl,python,ruby是动 态语言,c++、java、c#不是动态语言。虽然java在这样的定义下不是动态语言,但他却 有一个非常突出的动态相关机制:reflection,这个词的意思是"反射、映象、倒影", 用在java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes, 换句话说,java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包 括methods定义),并生成其对象,或对其fields(变量)设值,调用其methods(方法),这 种"看透class"的能力(the ability of the program to examine itself),被称为 introspection(内省、内观、反省),reflection和introspection是常被并称的两个术 语。
2 反射成员
Java 的反射机制是通过反射API 来实现的,它允许程序在运行过程中取得任何一个已知名 称的类的内部信息.反射API位于java.lang.reflect 包中, Constructor,Field,Method这 三个类都是JVM在程序运行时创建的,用来表示加载类中相应的成员,这三个类都实现了 java.lang.reflect.Member,下表列出了反射机制涉及的主要类:
类名 | 描述 |
---|---|
java.lang.Class | 是反射机制的基础,一切关于反射的故事,都从Class开始 |
java.lang.ClassLoader | 类加载器是负责加载类的对象 |
java.lang.reflect.Constructor | 用来描述一个类的构造方法 |
java.lang.reflect.Field | 用来描述一个类的成员变量 |
java.lang.reflect.Method | 用来描述一个类的方法 |
java.lang.reflect.Modifer | 用来描述类内各元素的修饰符 |
java.lang.reflect.Array | Array 类提供了动态创建和访问Java数组的方法 |
2.1 java.lang.Class
要使用反射,首先要得到Class对象,Class十分特殊,它和一般classes一样继承自 Object,其实体用以表达java执行期间的classes和interfaces,也用来表达 enum\array\primitive java types(boolean,byte,short,int,long,double)以及关键字 void,当一个class被载入,或当载入器被(class loader)的defineClass()被JVM呼 叫,JVM便自动产一个Class object。如果想藉由"修改java程序源码"来观察Class object的实际生成机制(例如在Class的construct内添加一个println()),不能够!因为 Class并没有public construct(下面的Class源码)。
public final
class Class<T> implements java.io.Serializable,
java.lang.reflect.GenericDeclaration,
java.lang.reflect.Type,
java.lang.reflect.AnnotatedElement {
/*
* Constructor. Only the Java Virtual Machine creates Class
* objects.
*/
private Class() {}
...
Class是Reflection故事起源,针对任何您想探勘的class,唯有先为它产生一个Class object,接下来才能经由后者唤起为数十多个reflection APIs,这些下表列出了几种得到 Class对象的方法
Class对象诞生方式 | 代码示例 |
---|---|
用getClass(),每个对象都有这个方法 | String str = "abc"; |
Class clazz = str.getClass(); | |
用Class.forName(className),这是静态方法 | Class clazz1 = Class.forName("java.lang.String"); |
Class clazz2 = Class.forName("java.io.File"); | |
通过类的静态变量class | Class clazz1 = String.class; |
Class clazz2 = File.class; | |
用primitive wrapper classes的TYPE 语法 | Class clazz1 = Double.TYPE; |
Class clazz2 = Void.TYPE; | |
Class clazz3 = int.TYPE; |
2.2 Constructor
通过Class调用newInatance方法可以创建类的实例,但只能调用类默认构造函数,即无 参数的构造函数,如果要调用有参数的构造函数,就需要获取类构造方法的 Constructor对象
获取Constructor | 描述 |
---|---|
Constructor[] getDeclaredConstructors() | 返回已加载类声明的所有构造方法的Constructor数组 |
Constructor getDeclaredConstructor(Class[] paramTypes) | 返回指定的,已加载类声明的构造方法的Constructor对象, |
paramTypes指定了参数类型 | |
Constructor[] getConstructors() | 返回已加载类声明的所有public构造方法的Constructor数组 |
Constructor getConstructor(Class[] paramTypes) | 返回指定的,已加载类声明的public构造方法的Constuctor对象, |
paramTypes指定了参数类型 |
2.3 Field
通过Field对象可以获取类成员变量
获取Field | 描述 |
---|---|
Field[] getDeclaredFields() | 返回已加载类声明的所有成员变量的Field对象数组,不包括从父类继承的变量 |
Field getDeclaredField(String name) | 返回已加载类声明的成员变量的Filed对象,不包从父类继承的变量, |
参数name指定成员变量的名称 | |
Field[] getFields() | 返回已加载类声明的所有public成员变量的Field对象数组,包括从父类继承的变量 |
Field getField(String name) | 返回已加载类声明的public成员变量的Field对象,包括从父类继承的变量, |
参数name指定成员变量的名称 |
2.4 Method
通过Method对象可以获取类方法
获取Method | 描述 |
---|---|
Method[] getDeclaredMethods() | 返回已加载类声明的所有方法的Method对象数组,不包括从父类继承的方法 |
Method getDeclaredMethod(String name,Class[] types) | 返回已加载类声明的Method对象,不包括从父类继承的方法, |
参数name指定方法的名称,参数paramTypes指定方法参数类型 | |
Method[] getMethods() | 返回己加载类声明的public方法的Method对象数组,包括从父类继承的方法 |
Method getMethod(String name,Class[] types) | 返回己加载类声明的public方法的Method对象,包括从父类继承的方法, |
参数name指定方法的名称,参数paramTypes指定方法参数类型 |
3 待续:实际的例子
Date: 2013-08-09 17:45:54
Author: machine.of.awareness@gmail.com
Org version 7.8.06 with Emacs version 23
java 反射机制01的更多相关文章
- java反射机制入门01
java反射机制入门是我从极客学院的视频中学习的. 1.反射机制背景概述 反射(Reflection)是java被视为动态(或准动态)语言的一个关键性质.反射机制指的是程序在运行时能够获取任何类的内部 ...
- Java 反射机制浅析
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反 ...
- Java反射机制详解(1) -反射定义
首先,我们在开始前提出一个问题: 1.在运行时,对于一个java类,能否知道属性和方法:能否去调用它的任意方法? 答案是肯定的. 本节所有目录如下: 什么是JAVA的反射机制 JDK中提供的Refle ...
- Java 反射机制(包括组成、结构、示例说明等内容)
第1部分 Java 反射机制介绍 Java 反射机制.通俗来讲呢,就是在运行状态中,我们可以根据“类的部分已经的信息”来还原“类的全部的信息”.这里“类的部分已经的信息”,可以是“类名”或“类的对象” ...
- Java 反射机制介绍
参考文章:http://www.cnblogs.com/skywang12345/p/3345205.html Java 反射机制.通俗来讲呢,就是在运行状态中,我们可以根据“类的部分已经的信息”来还 ...
- [转载]Java 反射机制(包括组成、结构、示例说明等内容)
FROM:http://www.cnblogs.com/skywang12345/p/3345205.html 第1部分 Java 反射机制介绍 Java 反射机制.通俗来讲呢,就是在运行状态中,我们 ...
- 文末送书四本 | 这篇Java反射机制太经典!不看后悔!
先看再点赞,给自己一点思考的时间,如果对自己有帮助,微信搜索[程序职场]关注这个执着的职场程序员. 价值:Java技能,面试经验指导,简历优化,职场规划指导,技能提升方法,讲不完的职场故事,个人成长经 ...
- 第28章 java反射机制
java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...
- Java反射机制
Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射: 静态编译:在编译时确定类型,绑定对象,即通过 ...
随机推荐
- 【转帖】ios上取得设备唯一标志的解决方案
原文地址:http://lqzit.iteye.com/blog/2070306 注意:keychina设置完之后,项目目录里的“项目名.entitlements”文件不是手动创建出的,而是在按照如下 ...
- 进程process和线程thread的关系
写的很好很明白cpu每次只能执行一个进程,所以其他进程会挂起 在一个进程中,允许存在n个线程,n个线程共享这个进程中的资源 多个线程在共享的时候存在资源互斥,一次只能一个线程,会需要加锁 一次存在固定 ...
- R 学习1
首先安装吧 http://cran.rstudio.com/bin/windows/base/R-3.2.1-win.exe 里面既有32位又有64. R有很多包,如果有的包本地没有,来这里搜 htt ...
- (实用篇)php处理单文件、多文件上传代码分享
php处理 单文件.多文件上传实例代码,供大家参考,具体内容如下 后台处理文件submit_form_process.php <?php /************************** ...
- css在各浏览器中的兼容问题
CSS对浏览器的兼容性有时让人很头疼,或许当你了解当中的技巧跟原理,就会觉得也不是难事,从网上收集了IE7,6与Fireofx的兼容性处理方法并 整理了一下.对于web2.0的过度,请尽量用xhtml ...
- Java 抓取网页内容
前两天想写一段自动提取微博状态的代码.据我所知,实现这个功能即可以用PHP写,也可以用Java写.我认为用Java写调试方便一点,PHP的脚本还要上传到服务器什么的. 代码很简单的,新建一个java. ...
- 关于for,while与do while
Q:输入一个整数i,输出i+(i+1)+...+19+20的结果 S:法1:for #include<stdio.h> #include<math.h> #include< ...
- dede模板完全控制攻略
1.使用php代码 @me代表了当前字段的值 {dede:tagname runphp='yes'} @me = "123456";//如果使用了自定义函数 则@me得到的是函数返 ...
- Linux-同步异步非阻塞阻塞的解析
一.理解同步.异步.阻塞.非阻塞 出场人物:老张,水壶两把(普通水壶,简称水壶:会响的水壶,简称响水壶). 1 老张把水壶放到火上,立等水开.(同步阻塞) 老张觉得自己有点傻. 2 老张把水壶放到火上 ...
- 套接字I/O模型-WSAAsyncSelect
利用这个异步I/O模型,应用程序可在一个套接字上接收以Windows消息为基础的网络事件通知.WSAAsyncSelect和WSAEventSelect提供读写数据能力的异步通知,但它们不提供异步数据 ...