1简 介

JAVA language,语言包,提供利用Java编程语言进行程序设计的基础类。包含Java语言所需要的基本功能类、接口等信息。将基本类型的值封装成对象包装器类(如 Boolean、Character、Integer、Long、Float 和 Double等);注解;反映;MxBean;Compiler、Runtime、进程Process、线程Thread;Class、ClassLoader、Package、Object等。

2体系结构

2.1 Annotation注解(@interface)

背景:在java中,注解作为程序的元数据嵌入到程序当中,元数据标签的存在并不影响程序代码的编译和执行。所谓Annotation就是提供了一种为程序元素设置元数据的方法,可用于修饰包、类、构造器、方法、成员变量、参数和局部变量(具体详见元注解 Target)的声明。注解可以被一些解析工具或者是编译工具进行解析。Annotation中的信息可以在编译、加载和运行时被读取(具体详见元注解 Retention),并执行相应的处理。当前许多java框架中大量使用注解,如Hibernate、Jersey、Spring.

数据和元数据:数据是指普通文件中的实际数据,而元数据指用来描述一个文件的特征的系统数据,诸如访问权限、文件拥有者以及文件数据块的分布信息等等。在集群文件系统中,分布信息包括文件在磁盘上的位置以及磁盘在集群中的位置。用户需要操作一个文件必须首先得到它的元数据,才能定位到文件的位置并且得到文件的内容或相关属性

引入原因:1)可将方法声明为服务 2)定义了一种标准的描述元数据的方式

定义:使用@interface可自定义注解,类自动继承java.lang.annotation.Annotation接口,不能继承其他的注解或接口。

格式:public @interface 注解名 {定义体},成员变量遵守规则:

以无形参的方法形式来声明,其方法名和返回值定义了该成员变量的名字和返回类型。

使用带有属性的Annotation时,必须为其属性指定值或通过default关键字指定默认值。

属性类型只能是基本类型、String(不允许Integer、Double等)、enum、Class及上述类型的一维数组类型。

JDK Annotation关系图:

5个元注解 meta-annotation

元注解的作用就是负责注解其他注解。Java8定义5个标准的 meta-annotation 类型,即@Target、@Retention、@Repeatable、@Documented、@Inherited,它们被用来提供对其它 annotation 类型作说明(只能作用在注解上,不能作用在其他程序元素上)。

Target 元素种类【重要】

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.ANNOTATION_TYPE)

public @interface Target {

ElementType[] value();

}

指示注解类型所适用的程序元素的种类,明晰其修饰的目标.

@Target用来限定一个Annotation可以用于修饰哪些程序元素(可修饰的程序元素由 ElementType 限定),由@Target(ElementType.ANNOTATION_TYPE)来限定,表明此注解只能用在注解类型元素的声明上,如果无@interface Target,则在自定义@interface注解时必须在头部加上使用元注解如@Target(value = { ElementType.TYPE, ElementType.METHOD, ElementType.LOCAL_VARIABLE, ElementType.FIELD })

ElementType定义:

1 TYPE:类、接口(包括注解类型) 或enum声明描述;

2 FIELD:属性描述;   3.METHOD:方法描述;   4.PARAMETER:参数描述;

5 CONSTRUCTOR:构造器描述;     6.LOCAL_VARIABLE:局部变量描述;

7 Annotation_Type:注解类型描述;   8 PACKAGE:包描述;

9 Type_Parameter:类型参数描述;   10 Type_Use:使用类型;

Retention 保留策略【重要】

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.ANNOTATION_TYPE)

public @interface  Retention {

RetentionPolicy value();

}

指示注解类型的注解要保留多久。

由@Retention(RetentionPolicy.RUNTIME)来指定保留,如果注解类型声明中不存在 Retention 注解,则保留策略默认为 RetentionPolicy.CLASS。

RetentionPolicy定义:

SOURCE:在源文件中有效(即源文件保留),编译compiler失效;

CLASS:在class文件中有效(即class保留),默认保留策略,VM运行失效;

RUNTIME:在VM运行时有效(即运行时保留),支持通过反射获取注解信息。

Documented 文档化

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.ANNOTATION_TYPE)

public @interface  Documented {

}

指示某一类型的注释将通过 javadoc 和类似的默认工具进行文档化。

Inherited 自动继承

@Documented

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.ANNOTATION_TYPE)

public @interface Inherited {

}

指示注解类型被自动继承。

如果在注解类型声明中存在 Inherited 元注解,并且用户在某一类声明中查询该注解类型,同时该类声明中没有此类型的注解,则将在该类的超类中自动查询该注解类型。此过程会重复进行,直到找到此类型的注解或到达了该类层次结构的顶层 (Object) 为止;如果没有超类具有该类型的注解,则查询将指示当前类没有这样的注解。此元注解仅促成从超类继承注解,对已实现接口的注解无效。

Repeatable重复注解(JDK1.8新加)

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Repeatable {
    /**
     * Indicates the <em>containing annotation type</em> for the
     * repeatable annotation type.
     * @return the containing annotation type
     */
    Class<? extends Annotation> value();
}

允许在同一申明类型(类,属性,或方法)的多次使用同一个注解。

以上5个元注解共性:定义包含@Target(ElementType.ANNOTATION_TYPE)

注解只能用在注解类型元素的声明上,由 ElementType 限定;@Retention(

RetentionPolicy.RUNTIME),即运行时 VM 保留注解

Native注解(JDK1.8新加)

@Documented

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.SOURCE)

public @interface Native {}

仅仅用来标记native的属性。

2.2反射Reflect

在运行状态中,对于任意一个类,都能够知道此类的所有属性和方法;对于任意一个对象,都能够调用此对象的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法 的功能称为java语言反射Reflection机制,使的Java具体了“动态性”。

基本概念

正常情况下,如要使用类,则必须按照如下的步骤操作:

1)使用import导入类所在的包(类java.lang.Class)。

2)明确的使用类名称或接口名称定义对象。

3) 通过关键字new进行类对象实例化(构造方法:reflect.Constructor)。

4) 产生对象可使用”对象.属性”进行类属性的调用(属性reflect.Field)。

而反射过程时不需要明确类型的对象,所有的对象使用Object表示,类关系图:

AnnotatedElement:注解元素操作类。表示运行在当前VM中的程序注解元素,这个接口允许对注解进行反射,该接口中方法返回的所有注释都是不可变的和可序列化的。这个接口的方法返回的数组可能会被调用者修改,而不会影响到返回给其他调用者的数组。
Member:提供类和接口,以获取关于类和对象的反射信息。
GenericDeclaration:声明类型变量的所有实体的公共接口
AccessibleObject:Field,Contrutor,Method类的基本类,用于控制可访问.

Filed:类中的属性
Executable:Constructor,Method共享通用功能的超类
Contrutor:类中的构造器  Method:类中的方法  Annotation:类中的注解

Object:对象类,类层次结构的根   Type:返回这个类的名称(e.g. java.lang.Class)  Class:Class代表类的实例(类类型)

Class类-实例化对象

涉及方法:

@CallerSensitive

public T newInstance(){...}//调用类默认无参构造函数实例化类对象

@CallerSensitive

public Constructor<?>[] getConstructors(){...}//取得类之中的全部构造

public Constructor<T> getConstructor(Class<?>... parameterTypes){...}//取得类之中指定参数的构造

package lang.reflect;
public class Person {private String name = "CJ";public Person() {System.out.print("Peson类的无参构造方法,name="+name +"...");}public Person(String name) {this.name = name;System.out.print("Peson类的带参构造方法,name="+this.name+"...");}@Overridepublic String toString() {return "Peson类的toString()方法...";}public String getName() {System.out.println("Peson getName="+this.name+"...");return name;}public void setName(String name) {this.name = name;System.out.print("Peson setName="+this.name+"...");       }public static void main(String[] args) throws Exception {System.out.println("*1 Class newInstance(),调用类默认无参构造函数 实例化类对象*");Class<?> defalutClazz = Class.forName("lang.reflect.Person");Object defalutObj = defalutClazz.newInstance();System.out.println(defalutObj);System.out.println("*2 Constructor newInstance(参数值),调用类带参构造函数实例化类对象*");Class<?> clazz = Class.forName("lang.reflect.Person");Constructor<?> constu = clazz.getConstructor(String.class);//Constructor<?> cons[] = clazz.getConstructors();//or get all constructorsObject constuObj = constu.newInstance("CJ-Constructor");System.out.println(constuObj);}
}

Output:*1 Class newInstance(),调用类默认无参构造函数 实例化类对象*

Peson类的无参构造方法,name=CJ...Peson类的toString()方法...

*2 Constructor newInstance(参数值),调用类带参构造函数实例化类对象*

Peson类的带参构造方法,name=CJ-Constructor...Peson类的toString()方法...

Constructor类-操作构造方法

@CallerSensitive

public T newInstance(Object ... initargs){...}//调用类带参构造函数实例化类对象

Class类-调用方法Method

涉及方法:

1)取得父类继承而来的方法和本类方法:
取得全部方法 Methods[] getMethods();
取得指定方法 Methods getMethod(String name, Class<?>… parameterType)
  2)取得本类定义的方法
取得全部方法 Method[] getDeclaredMethods()
取得指定方法 Method getDeclaredMethod(String name,Class<?>… parameterType)

Person类启动方法加入代码:

System.out.println("*3 Method 反射调用类中的方法*");

Method msetNameMethod = defalutObj.getClass().getDeclaredMethod("setName",String.class);

msetNameMethod.invoke(defalutObj,"CJ-setName");

Method mgetNameMethod = defalutObj.getClass().getDeclaredMethod("getName", new Class<?>[0]);

mgetNameMethod.invoke(defalutObj);

Output: *3 Method 反射调用类中的方法*

Peson setName=CJ-setName...Peson getName=CJ-setName...

Class类–调用类中的属性Field(尽量不要去使用)

关于类中的属性也可以直接利用反射进行操作,而支持的方法有两类:
1)取得所有继承而来的属性
取得全部属性 public Field[] getFields()
取得指定属性 public Field getField(String name)
2)取得本类定义的属性
取得本类全部属性public Field getDeclareFields()
取得本类全部属性public Field getDeclareField(String name)

Method类-反射调用类中的方法

涉及方法:

public Object invoke(Object obj, Object… args)

Person类启动方法加入代码:

System.out.println("*3 Method 反射调用类中的方法*");

Method _setName = clazz.getMethod("setName",String.class);

_setName.invoke(defalutObj, "CJ-setName");

Method getNameMethod = clazz.getMethod("getName");

getNameMethod.invoke(defalutObj);

Output: *3 Method 反射调用类中的方法*

Peson setName=CJ-setName...Peson getName=CJ-setName...

Method类-常用方法

1)取得方法的返回类型:public Class<?> getReturnType();
2)取得方法的参数:public Class<?> getParameterTypes();
3)取得所有抛出的异常:public Class<?> getExceptionTypes();

Field类-设置/获取属性内容

1)设置属性内容:public void set(Object obj, Object value)
2)取得属性内容:public Object get(Object obj);

Person类启动方法加入代码:

System.out.println("*4 Field类-设置/获取属性内容*");

Field nameField = clazz.getDeclaredField("name");

nameField.setAccessible(true);//必须设置可访问

nameField.set(defalutObj, "CJ-Field");

System.out.print(nameField.get(defalutObj));

Output:*4 Field类-设置/获取属性内容*

CJ-Field

注:1)Constructor、Method、Field三个类上有一个共同的父类 AccessibleOblect,在这个类中定义了可以取消封装操作:public void setAccessible(boolean flag)

2)参数官网:https://www.programcreek.com/2013/09/java-reflection-tutorial/

2.3基础数据类型

关系图:

public abstract class Number:

4个抽象方法被子类实现,byteValue(),shortValue()被java.math包BigInteger类调用。

JDK8-Lang框架分析(二)相关推荐

  1. LCD DRM驱动框架分析二

    本文是基于rk3566 / rk3568平台从LCD代码层面上对LCD DRM框架进行分析. 一.uboot阶段 1.涉及的驱动文件 2.uboot代码流程分析 2.1)各probe函数的加载 2.1 ...

  2. Android 8.0 RIL框架分析

    原文地址:https://blog.csdn.net/qq_27540925/article/details/79356799 前言 Android O的版本对RIL的框架的通信功能进行了改动,不在使 ...

  3. PLUS模型有两大模块,一是基于土地扩张分析策略的规则挖掘框架,二是基于多类型随机补丁种子的CA模型,此外该模型还内嵌了Markov chain,以便于对土地利用数量需要作出预测。

    工业革命以来,社会生产力迅速提高,人类活动频繁,此外人口与日俱增对土地的需求与改造更加强烈,人-地关系日益紧张.此外,土地资源的不合理开发利用更是造成了水土流失.植被退化.水资源短缺.区域气候变化.生 ...

  4. nrf52832 学习笔记(二)SDK框架分析

    nrf52832 学习笔记(二)SDK框架分析 个人对SDK框架的一些理解,如有错误欢迎斧正. flash 分区 在不包含DFU的情况下,nrf52832 flash划分为: MBR 0x000000 ...

  5. Nouveau源码分析(二):Nouveau结构体的基本框架

    Nouveau源码分析(二) 在讨论Nouveau对Nvidia设备的初始化前,我准备先说一下Nouveau结构体的基本框架 Nouveau的很多结构体都可以看作是C++中的类,之间有很多相似的东西, ...

  6. Linux i2c驱动框架分析 (二)

    Linux i2c驱动框架分析 (一) Linux i2c驱动框架分析 (二) Linux i2c驱动框架分析 (三) 通用i2c设备驱动分析 i2c core i2c核心(drivers/i2c/i ...

  7. 深入分析Linux PCI驱动框架分析(二)

    说明: Kernel版本:4.14 ARM64处理器 使用工具:Source Insight 3.5, Visio 1. 概述 本文将分析Linux PCI子系统的框架,主要围绕Linux PCI子系 ...

  8. java连接linux服务器执行shell命令(框架分析+推荐)

    java连接linux服务器执行shell命令(框架分析+推荐) 一.分类+连接方式 程序打成jar包,在本地服务器上执行shell命令.这种使用MyRuntimeUtil工具类 java程序远程li ...

  9. SpringBoot源码分析(二)之自动装配demo

    SpringBoot源码分析(二)之自动装配demo 文章目录 SpringBoot源码分析(二)之自动装配demo 前言 一.创建RedissonTemplate的Maven服务 二.创建测试服务 ...

  10. Flutter框架分析(五)-- 动画

    Flutter框架分析分析系列文章: <Flutter框架分析(一)-- 总览和Window> <Flutter框架分析(二)-- 初始化> <Flutter框架分析(三 ...

最新文章

  1. hdu4720 三角形的外接圆
  2. Shodan搜索引擎介绍
  3. C语言socket connect()函数(初始化套接字上的连接)(未完)(如何测试socket是否已经断开,如何判断socket是否断开)
  4. opencv python cv2.imdecode()函数报错 :TypeError: Expected cv::UMat for argument 'buf'
  5. python-socket
  6. svn服务器搭建和使用_简单使用nodejs搭建一个静态服务器
  7. 【渝粤题库】广东开放大学 静态网页技术 形成性考核
  8. 通过#define连接字符串的特殊方法[转]
  9. [论文阅读] Multiple Instance Active Learning for Object Detection
  10. java中nul值的处理
  11. VPP 命令总结(持续更新)
  12. 【转载】20种PLC对应Modbus地址表
  13. Java实现中文汉字转换拼音,解决多音字问题
  14. 艾可森 mysql,国足进世界杯有戏!巴西归化球员表决心:中国对我好,我必须努力...
  15. 红杉资本合伙人Maguire:Crypto将是未来30年最大趋势 |链捕手
  16. Visual Studio 6.0下载地址
  17. 使用itext创建PDF模板
  18. 使用office2007发表csdn博客
  19. 邮件服务器 web管理,修改Webmail地址 - 邮件服务器Webmail地址(无限用户¥2200)
  20. MES系统读取MySQL数据_MES系统数据库

热门文章

  1. 计算机网络课后作业习题2
  2. qq空间不能访问解决方法
  3. 自媒体账号如何注册申请
  4. 快速入门——深度学习理论解析与实战应用
  5. 一文读懂自然语言处理NLP
  6. 小人有三种,这种最阴险,最好策略不是硬杠
  7. 华山论剑之iOS的淫思巧计(持续更新中..)
  8. PIC16F877A与Proteus仿真-1位7段数码管驱动
  9. Riverbed宣布收购领先的Wi-Fi网络提供商Xirrus
  10. 绝对优势与比较优势的数学分析与其…