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的

reference type有用。


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 不能被继承!




0 0
原创粉丝点击