美文网首页
Java:反射

Java:反射

作者: Spect | 来源:发表于2018-01-20 18:11 被阅读0次

编程语言分类(以程序运行时结构及变量类型的可变性作为标准):

--|1.静态语言

--|2.动态语言:程序运行时,允许改变程序的结构及变量类型的语言;

~由此,Java、C++、C#是非动态语言,而Perl、Python、Ruby是动态语言

·Java中按照加载时机将类的加载类型划分为编译时检查类型、运行时加载类型

1.编译时检查类型的类(运行时已识别类型:RTTI--Run Time Type Identificated):编译时识别,该类型的类在编译时由编译器检查确认,在运行时加载

2.运行时加载类型(反射:主要用于构造工具):从其他地方得到一个未知类的对象,在程序运行时动态的将该未知类对象所在类文件加载到Java Virtual Machine中

---- 反射(Reflective): 能够分析类能力的程序

···反射库(Reflection Library)-丰富且精心设计的工具集,方便编写能够动态操纵Java代码的程序。这项功能被大量应用与JavaBeans中,JavaBeans为Java组件的的体系结构,在设计或运行中添加新类时,可以快速应用开发工具动态查询新添加类的能力(具体体现为获得新类的实例域及方法);

·反射机制的作用:

    1.程序运行时动态分析类的能力

    2.程序运行时动态查看对象,例如:编写一个toString方法供所有类使用

    3.实现通用的数组操作代码

    4.利用Method对象(对象类似于C++中的函数指针)

反射中的类Class、Constructor、Method


·Class类(泛型类--例如:Employee.class的类型是Class<Employee>):保存对象在程序运行时的类型信息(程序运行期间,Java运行系统始终为所有的对象维护一个被称为运行时的类型标识。该信息跟踪着每个对象所属的类。虚拟机利用运行时类型信息选择相应的方法执行),一个Class对象表示一个特定类的属性

Class类中的方法:

1.public String getName(){} -- 返回类的名字


2.public static Class forName(String className){} -- 返回对应className的类的Class对象(className:类或接口的全名,即包名.类名),需处理异常:ClassNotFoundException

3.T表示任意Java类型:则T.class将代表T对应的Class类对象

4.任意对象都有的方法:public Class getClass(){} -- 返回调用该方法的对象的所属类的Class类对象

注:2、3、4为获取Class类对象的方法(以下仅针对获取Class类对象这一过程)

>其中编号为2的方法仅需要类的名字,而不需要导入包,更加具有普遍意义(反射 -- 运行时检查,处理的运行时异常为ClassNotFoundException);

>编号为3的方法需要类的名字,且需要导入相应的包(编译时检查);

>编号4的方法需要类对象且需要导入相应的包(编译时检查);


5.public Method getMethod(String methodName, Class...parametersType){} -- 返回特定方法的Method对象 

>第一个参数为方法名字,之后的参数为要获取方法的参数所在类的Class对象(以下同此格式可以此方式解释)

6.public Method[ ] getMethods(){} -- 返回Class对象指向的类中以public作为访问权限修饰符的方法

>以下同此格式可以此方式解释(实在拗口,书写不便,见谅!)

7.public Method[ ] getDeclaredMethods(){} -- 返回Class对象指向的类中的所有方法(包括protected、private修饰的方法)的Method对象的数组;

>以下同此格式可以此方式解释(实在拗口,书写不便,见谅!)

注:5、6、7为Class类中获取Class对象指向的类中的方法的方法


8.public Constructor getConstructor(Class...parameterTypes){} -- 返回Class对象中特定构造器的Constructor对象

9.public Constructor[ ] getConstructors(){} -- 返回包含Class对象中公共构造器对象的Constructor数组

10.public Constructor[ ] getDeclaredConstructors(){} -- 返回包含Class对象中所有构造器对象的Constructor数组

注:8、9、10为Class类中获取Class对象中的构造器的方法

11.public Field getField(String name){} -- 返回Class对象中的特定实例域的Field对象

12.public Field[ ] getFields(){} -- 返回包含Class对象中公共实例域对象的Field数组

13.public Field[ ] getDeclaredFields(){} -- 返回包含Class对象中所有实例域对象的Field数组

注:11、12、13为Class类中获取Class对象中的实例域的方法(因封装原理,一般getDeclaredFields(){}是无意义的)

14.public void setAccessible(boolean flag){} -- 设置访问Class对象所指向的类的私有属性权限


Method类:描述方法的类

Method类对象指向具体的方法,类似于C、C++中的函数指针;

Method类中的方法:

public void invoke(String methodName, Object...parameters){} -- 调用Method类对象所指的方法(在运行时动态调用需要的方法)


Constructor类:描述构造器的类

Constructor类对象指向具体的构造器,本质是函数,也类似于C、C++中的函数指针;

Constructor类中的方法:

public Object newInstance(Object...parameters){} -- 调用Constructor类对象所指的构造器


Field类:描述实例域的类

关于实例域(Field):

-- 封装:从形式上看封装不过是将数据和行为组合在一个包内,并对对象的使用者隐藏了行为的实现方式。对象中的数据称为实例域(instance field),这些值的集合就是这个对象的当前状态(state)。向对象发送一条消息,它的状态就有可能发生改变。

对象的主要特性:

    1.对象的行为(behavior) -- 可以对对象施加哪些操作,或可以对对象施加哪些方法

    2.对象的状态(state) -- 当施加方法时,对象如何响应

    3.对象表示(identity) -- 如何辨别具有相同行为与状态的不同对象

大致上的含义是改变数据的方式、改变后的数据代表的意义、标示相同数据的不同含义

>由此,对象即一组数据,而数据能够通过逻辑运算实现人为赋予的抽象意义!!


!·待补充 -- 动态代理

相关文章

  • 博客地址

    java注解-01、java注解-02、Git面试资源java反射-01、java反射-02、java反射-03为...

  • Java反射机制入门

    Java反射机制入门 一、什么是反射 JAVA反射机制(The JAVA reflection mechanism...

  • Java基础之反射

    Java基础之—反射(非常重要)Java中反射机制详解Java进阶之reflection(反射机制)——反射概念与...

  • 反射之一

    总结内容源自一下文章粗浅看java反射机制反射机制应用实践谈谈java反射机制Java Reflection(反射...

  • 反射之二

    总结内容源自一下文章粗浅看java反射机制反射机制应用实践谈谈java反射机制Java Reflection(反射...

  • Java基础之反射

    Java基础之反射 反射基本介绍 反射的使用通过反射调用属性和方法通过反射获取配置文件 反射基本介绍 Java反射...

  • Java 反射机制

    Java 反射机制 什么是反射 Java 反射是Java语言的一个很重要的特征,它使得Java具体了“动态性”。 ...

  • 一探究竟:Java反射效率低的原因到底在哪?

    预备知识 了解 Java 反射基本用法 看完本文可以达到什么程度 了解 Java 反射原理及 Java 反射效率低...

  • 面试官说:大家都说 Java 反射效率低,你知道原因在哪里么

    预备知识 了解 Java 反射基本用法 看完本文可以达到什么程度 了解 Java 反射原理及 Java 反射效率低...

  • Java面试题之JavaSE高级

    一、Java中的反射 1.说说你对Java中反射的理解 java中的反射首先是能够获取到Java...

网友评论

      本文标题:Java:反射

      本文链接:https://www.haomeiwen.com/subject/qxtbnxtx.html