java反射机制总结

【0】README

0.1)以下内容转自: http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html
0.2)for source code, please visit (1~14 source code : https://github.com/pacosonTang/core-java-volume/blob/master/chapter5/ReflectionCluster.java)


1)通过一个对象获得完整的包名和类名(添加一句:所有类的对象其实都是Class的实例)
这里写图片描述


2)实例化Class类对象
这里写图片描述


3)通过Class实例化其他类的对象(通过无参构造实例化对象)
这里写图片描述


4)调用有参构造器构造类的实例
这里写图片描述


5)返回一个类实现的接口 + 继承的父类
这里写图片描述


6)获得其他类中的全部构造函数
这里写图片描述


7)获取类中所有方法(包括方法参数列表,修饰符,所抛出异常,返回值)
这里写图片描述


8)取得其他类的全部属性,最后将这些整理在一起,也就是通过class取得一个类的全部框架
这里写图片描述


9)通过反射调用其他类中的方法
这里写图片描述


10)调用其他类的set和get方法(修改器setter 和 访问器getter)
这里写图片描述


11)通过反射操作属性
这里写图片描述


12)通过反射取得并修改数组的信息
这里写图片描述


13)通过反射修改数组大小
这里写图片描述


14)动态代理

  • 14.1)如何获得类加载器
    这里写图片描述

  • 14.2)其实在java中有三种类类加载器

    • 1)Bootstrap ClassLoader: 此加载器采用c++编写,一般开发中很少见;
    • 2)Extension ClassLoader: 用来进行扩展类的加载,一般对应的是jre\lib\ext目录中的类;
    • 3)AppClassLoader: 加载classpath指定的类,是最常用的加载器。同时也是java中默认的加载器;
    • 4)如果想要完成动态代理,首先需要定义一个InvocationHandler接口的子类,以完成代理的具体操作;(干货——动态代理不太熟悉,仅供了解吧)
      这里写图片描述
//定义项目接口
interface Subject {public String say(String name, int age);
}// 定义真实项目
class RealSubject implements Subject {@Overridepublic String say(String name, int age) {return name + "  " + age;}
}class MyInvocationHandler implements InvocationHandler {private Object obj = null;public Object bind(Object obj) {this.obj = obj;return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {Object temp = method.invoke(this.obj, args);return temp;}
}class hello {public static void main(String[] args) {MyInvocationHandler demo = new MyInvocationHandler();Subject sub = (Subject) demo.bind(new RealSubject());String info = sub.say("Rollen", 20);System.out.println(info);}
}
  • 14.3)类的生命周期(在一个类编译完成之后,下一步就需要开始使用类,如果要使用一个类,肯定离不开JVM。在程序执行中JVM通过装载,链接,初始化这3个步骤完成)
    • 14.3.1)类的装载: 是通过类加载器完成的,加载器将.class文件的二进制文件装入JVM的方法区,并且在堆区创建描述这个类的java.lang.Class对象。用来封装数据。 但是同一个类只会被类装载器装载以前;
    • 14.3.2)类的链接:就是把二进制数据组装为可以运行的状态;
      • 14.3.2.0)链接分为校验,准备,解析这3个阶段
      • 14.3.2.1)校验:一般用来确认此二进制文件是否适合当前的JVM(版本);
      • 14.3.2.2)准备:就是为静态成员分配内存空间。并设置默认值;
      • 14.3.2.3)解析:指的是转换常量池中的代码作为直接引用的过程,直到所有的符号引用都可以被运行程序使用(建立完整的对应关系)
    • 14.3.3)类初始化: 完成之后,类型也就完成了初始化,初始化之后类的对象就可以正常使用了,直到一个对象不再使用之后,将被垃圾回收。释放空间;
    • 14.3.4)结束生命周期:当没有任何引用指向Class对象时就会被卸载,结束类的生命周期;

15) 将反射用于工厂模式

  • 15.1)不用反射的工厂模式:
    (https://github.com/pacosonTang/core-java-volume/blob/master/chapter5/ReflectionFactory.java)
    这里写图片描述

    • 对以上代码的分析(Analysis): 这样,当我们在添加一个子类的时候,就需要修改工厂类了。如果我们添加太多的子类的时候,改的就会很多。
  • 15.2)用反射的工厂模式:
    (https://github.com/pacosonTang/core-java-volume/blob/master/chapter5/ReflectionFactoryWithReflection.java)
    这里写图片描述

  • 15.3)通过属性文件的形式配置所需要的子类: 上面的代码虽然可以通过反射取得接口的实例,但是需要传入完整的包和类名。而且用户也无法知道一个接口有多少个可以使用的子类:

    • 下面我们来看看: 结合属性文件的工厂模式
      (https://github.com/pacosonTang/core-java-volume/blob/master/chapter5/ReflectionFactoryProperties.java)

这里写图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331648.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言系统时间的作用,C语言得到当前系统时间

void getTime(){//获取当前系统时间time_t tTime;//距离1900年1月1日的秒数char str[80];struct tm* stTim;//时间结构time(&tTime);stTim localtime(&tTime);strftime(str,sizeof(str),"%Y%m%d%T",stTim);//格式化时间printf(str);}格式化时间的格式%a 星期…

aws集群重启_使用自动伸缩组在AWS中运行安全数据库集群

aws集群重启当您必须在AWS上运行可扩展应用程序时,您的数据库也必须是可扩展的。 扩展无状态应用程序层更容易,在无状态应用程序层中,每个节点几乎都是一次性的-即使3节点集群中的一个节点发生故障,您也可以启动另一个节点&#x…

接口 DataOutput

java.io 接口 DataOutput 所有已知子接口: ImageOutputStream, ObjectOutput 所有已知实现类: DataOutputStream, FileCacheImageOutputStream, FileImageOutputStream, ImageOutputStreamImpl, MemoryCacheImageOutputStream, ObjectOutputStream, Rand…

java流与文件——流

【0】README 0.1) 本文描述转自 core java volume 2, 旨在理解 java流与文件——流 的相关知识; 0.2) 输入流和输出流(InputStream 和 OutputStream传输单位是基于单字节): 0.2.1&#xff09…

c语言结构体定义字符串数组,C语言,结构体中字符串的声明(采用字符指针还是字符数组)...

结构体中,字符串选项是用字符数组表示好,还是用字符指针表示好?typedef struct person{char *name;int age;char sex[6];};该结构体中name用的是指针而不是数组,所以需要给字符串在堆上申请内存然后再赋值;…

java –cp ./:_成为Java流专家–第2部分:中级操作

java –cp ./:就像魔术棒一样,中间操作将一个Stream转换为另一个Stream。 这些操作可以无穷无尽的方式组合在一起,以可读有效的方式执行从简单到高度复杂的任务。 本文是五分之二,其中还有一个GitHub存储库,其中包含每个单元的说…

c语言编程代码对父母感恩,c语言中编程:每个做父母的都关心自己孩子成人后孩子的生高:...

c语言中编程:每个做父母的都关心自己孩子成人后孩子的生高:据有关生理卫生知识与数理统计分析表明,影响小孩成人后的身高的因素包括遗传、饮食习惯与体育锻炼等.小孩成人后的身高与其父母的身高和自身的性别密切相关.设faHeight为其父身高,moHeight为其母…

Servlet之javaweb应用(二)

一、 使用 JavaEE 版的 Eclipse 开发动态的 WEB 工程(JavaWEB 项目) 1). 把开发选项切换到 JavaEE 2). 可以在 Window -> Show View 中找到 Package Explorer, 并把其拖拽到开发区的左边 3). 在 Servers 面板中新建 Tomcat 服务器. 一定要关联到 Tomcat 安装的根目录 4). 新…

java流与文件——文本输入输出

【0】README 0.1) 本文描述转自 core java volume 2, 旨在理解 java流与文件——文本输入输出 的相关知识; 0.2) 在保存数据时,可以选择是二进制还是文本格式; 在存储文本字符串时, 需要考虑字…

RandomAccessFile类解析

【0】README 0.1) 本文描述转自 core java volume 2, 旨在理解 java流与文件——RandomAccessFile类解析 的相关知识; 0.1) 本文 转自: http://blog.csdn.net/akon_vm/article/details/7429245 , for com…

Servlet之Tomcat配置与启动(一)

一、 部署并启动 tomcat 服务器 1). 解压 apache-tomcat-7.0.11.zip 到一个非中文目录下 2). 配置一个环境变量 java_home(指向 JDK 安装的根目录) 或 jre_home 3). 通过双击 apache-tomcat-6.0.16\bin 目录下的 startup.bat, 启动服务器 4). 可以在浏览器中输入 localhost:8…

随机数生成器c语言,句子随机生成器-怎么用C语言生成随机数

为随机数生成器初始化一个种子值在易语言中使用什么命令名置随机数种子 ()‘调用格式: 〈无返回值〉 置随机数种子 (〔整数型 欲置入的种子数值〕) - 系统核心支持库->算术运算英文名称:randomize为随机数生成器初始化一个种子值,不同的种…

nsstring 空值比较_用比较器的nulls排序具有空值的列表

nsstring 空值比较你好朋友, 在本教程中,我们将看到如何使用Java 8 Comparator.nullsFirst在列表中的项目很少为空时如何对项目列表进行排序,从而将null视为列表中的最小元素。 –什么是比较器 – nullsFirst方法在Comparator中做什么 –…

hibernate的Configuration和配置文件

一、hibernate的入口Configuration 在Hibernate中,Configuration是hibernate的入口。在实例化一个Configuration的时候,Hibernate会自动在环境变量(classpath)里面查找Hibernate配置文件hibernate.properties。如果该文件存在&…

单片机c语言6种开方,单片机快速开平方的算法

C语言中开平方的算法中要开平方的话,可以在头文件中加#include .然后调sqrt(n);函数即可.但在单片机中要开平方.可以用到下面算法:算法1:本算法只采用移位、加减法、判断和循环实现,因为它不需要浮点运算,也不需要乘除运算,因此可以很方便地运…

spring 配置只读事务_只读副本和Spring Data第3部分:配置两个实体管理器

spring 配置只读事务我们之前的设置可以正常工作。 我们现在要做的是进一步发展,并配置两个单独的实体管理器,而不会影响我们之前实现的功能。 第一步是将默认实体管理器配置设置为主要配置。 这是第一步 package com.gkatzioura.springdatareadreplic…

java流与文件——读写二进制数据(DataOutput + DataInput)

【0】README 0.1) 本文描述转自 core java volume 2, 旨在理解 java流与文件——读写二进制数据(DataOutput DataInput)的相关知识; 0.2) for complete my diy code, please visit https://github.com/p…

dsp课程设计c语言源码,DSP课程设计-基于C语言实现256点的FFT精选.pdf

DSP课程设计-基于C语言实现256点的FFT精选XX 大学J1111111 UNIVERSITYDSP 课 程 设 计基于CCS 的FFT 算法的C 语言实现和验证学院名称:专业班级:学 号:学生姓名:指导教师姓名:201 年 0 月 0 日一、 课程设计目的1.此次…

java 字符数组与字符串_用于字符串和数组的5种简单有效的Java技术

java 字符数组与字符串Java通常会排在前五种最流行的编程语言中,因此可以理解。 它是一种通用语言,非常容易学习,因为它是一种高级语言,并且可以满足许多用例。 由于这些原因,Java是一门很棒的语言,可以用来…

Hibernate之映射

一、映射文件 Hibernate在实现ORM功能的时候主要用到的文件有: 1、 映射类(*.Java) 描述数据库表的结构,表的字段映射为类的属性,表的记录映射为类的对象。 2、映射文件(*.hbm.xml) …