java反射(Reflection)基础(个人学习笔记)
来源:互联网 发布:手机cad制图软件 编辑:程序博客网 时间:2024/05/01 04:27
反射主要常用在需要能力去检查或者修改在java虚拟机上运行的应用的runtime行为的程序上。
Java的反射机制非常强大,可以提供一些除了反射以外其他方式无法实现的运算,但是反射在性能和安全上面存在一些缺陷,所以如果可以不用反射就可以实现一些运算就尽量别用反射。
=======================================================================================
在学习反射之前,要对java的类和对象的原理上有一些了解。
Java 中,每个Object或者是一个 reference type, 或者是一个primitive type. 所有的reference type 都继承 java.lang.Object。
对于所有的对象类型,JVM会实例化一个java.lang.Class的不可更改的实例,提供方法来检测对象的runtime属性,包含对象的成员和类型信息。更重要的是,java.lang.Class 是所有 Reflection APIS 的入口点。
Object.getClass()
如果一个对象的实例是可以获得的,那么最简单的得到这个Class的方法是借助Object.getClass()。当然,这仅仅对于继承Object的
The.class Syntax
如果没有一个对象的实例但是对象的类型是可获得的,那么也可以通过添加”.class”到这个类型的名字后面来获得这个Class. 这也是获得primitive type的Class的最简单的方法。
Class.forName()
如果一个class的完全限定的名字是可获得的,那么可以通过静态方法Class.forName()来获取这个class. 这个方法不能用在primitive types上。数组类(array classes)的名字的syntax是通过Class.getName()来描述的。这个方法可以应用在references 和 primitive types 上。
TYPEField for Primitive Type Wrappers
所有的 primitive 和void 都在java.lang中有一个封装的类(wrapper class)用来将primitive types 包装成reference types.所有的wrapper class都包含一个名为 TYPE 的 filed(领域) 相当于被包装的primitive type 的类。
Methodsthat Return Classes
这里有一些Reflection ( 反射)APIS 返回classes但是只有当Class已经直接或者间接被获得的时候才能接入。
Class.getSuperClass()
返回给定class的 super class(超类)。
Class.getClasses()
返回这个类的所有的public classes 和 interfaces成员,这也包含其继承父类的所有的 public classes 和 interfaces 成员。
Class.getDeclaredClasses()
返回所有在给定class里明确定义的classesinterfaces, enums.
Class.getDeclaringClass()
java.lang.reflect.Field.getDeclaringClass()
java.lang.reflect.Method.getDeclaringClass()
java.lang.reflect.Constructor.getDeclaringClass()
返回这些被声明的成员的Class。Anonymous Class Declaration 没有declaring class但是会有一个encloing class.
Class.getEnclosingClass()
返回直接附着的指定class的class。
==================================================================================================
在了解了如何通过反射机制获取一个类之后,我们现在想要了解如何检测类的修饰语和类型。
一个class可以申明一个或者多个 可以影响其runtime 行位的modifiers(修饰语),主要的修饰语如下:
Access(访问) modifiers: public, protected, 和 private.
Modifier requiring override(覆盖): abstract
Modifier restricting to one instance: static
Modifier prohibiting value modification: final
Modifier forcing strict floating point behavior: strictfp
Annotations
不是所有的修饰语都可以用在所有的类里,比如一个interface不能用final 来修饰,或者一个enum也不能用abstract来修饰。java.lang.reflect.Modifier 包含对所有可能的修饰语的声明。它也包含可以用来解码被Class.getModifiers()返回的修饰语集合的方法。
现在举一个例子包含一些常用到的方法:
Class<?> c = Class.forName(AclassName);
//获取class
c.getCanonicalName();
//获取 modifiers(修饰语)
Modifier.toString(c.getModifiers());
// 获取Type Parameters(类型参数)
TypeVariable[] tv = c.getTypeParameters();
//获取 Implemented Interfaces(实现接口)
Type[] intfs = c.getGenericInterfaces();
//获取 superClass
Class<?> superClass = c.getSuperclass();
//获取 Annotations.
Annotation[] ann = c.getAnnotations();
==================================================================================================
最后,我们需要了解如何去发现类的所有成员。.
Class 提供两个种类的方法访问fields,methods, 和constructors。其中一个种类的方法用来枚举这些members。另外一个种类的方法找寻特殊的members。也有一些不同的方法通过查询inheritedmembers的superinterfaces和superclasses来访问直接在class与methods声明的members。
ClassMethods for Locating Fields:
getDeclaredField() ------------------ private members
getField()----------------------------- Inherited members
getDeclaredFields()----------------- List of members & private members
getFields()---------------------------- list of members &Inherited members
ClassMethods for Locating Methods:
getDeclaredMethod() ------------------ private members
getMethod ()----------------------------- Inherited members
getDeclaredMethod ()----------------- List of members & privatemembers
getMethods ()---------------------------- list of members &Inherited members
ClassMethods for Locating Constructors:
getDeclaredConstructor () ------------------ private members
getConstructor ()----------------------------- Inherited members
getDeclaredConstructor ()----------------- List of members &private members
getConstructors ()------------------------- List of members &Inherited members
** Constructors 不能被继承!
- java反射(Reflection)基础(个人学习笔记)
- Java基础---反射(Reflection)
- java反射学习(Reflection)
- java反射学习(Reflection)
- 【Java基础】反射 - Reflection
- Java Reflection(反射) 入门学习笔记 之一
- JAVA学习笔记(六十一)- 反射Reflection
- Java学习笔记之反射(Reflection)
- Java学习笔记之反射(Reflection)
- 反射(Reflection)基础
- Net反射(Reflection)学习笔记
- 黑马程序员---------Java反射(Reflection)笔记
- Java笔记-反射机制Reflection API(java动态机制)基础
- Java中反射机制(Reflection)学习
- Java中反射机制(Reflection)学习
- Java中反射机制(Reflection)学习
- Java中反射机制(Reflection)学习
- Java中反射机制(Reflection)学习
- 设计模式——其他
- 对xml文件进行整体转义 将& lt: >: 等变为<>
- 云豹POSPAL软件及硬件设置方法
- Linux 配置
- HTTP Error 503. The service is unavailable.
- java反射(Reflection)基础(个人学习笔记)
- iOS--日志重定向
- java多线程进阶
- 面试算法学习-7-跳台阶问题
- 学习笔记 05 --- JUC锁
- MySql安装教程
- live555 实现音视频传输关键
- 服务器系统日志报错科普
- javascript语言精粹笔记 1-4章