找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

只需一步,快速开始

2020年最新Java全套教程注解

查看: 4148| 评论: 7| 发布者: 李小明

??? ??С
简介:注解1. 注解概述1.1 注解解释注释: 解释代码,给程序员看 ? 注解: Java语言中的类、方法、变量、参数和包等都可以被标注。和Javadoc不同,Java标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌 ...

注解

1. 注解概述

1.1 注解解释
注释:解释代码,给程序员看?注解:Java语言中的类、方法、变量、参数和包等都可以被标注。和Javadoc不同,Java标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java虚拟机可以保留标注内容,在运行时可以获取到标注内容。 当然它也支持自定义Java标注JDK1.5之后的特征用于说明程序一般在框架中使用格式:@AnnotationName?文档注释:@param @return @Exeception 从根本上是一个注释,不存在代码编译,不会生成对应的.class字节码问题,只是提供给JavaDoc API文件生成工具。作为标记生成对应的文档。注解是有一部分参与编译@Override并不是没编译就有效果了,是因为不管是Eclipse还是IDEA都可以预编译Java代码生成对应的.class文件的
1.2 注解作用
生成文档:代码中生成对应的JavaDoc API文档@param @return 【IDEA JavaDoc工具使用参数】Other Command Line Arguments : -encoding utf-8 -charset utf-8解决中文乱码,因为IDEA默认编码集为UTF-8 Windows GKB?代码检查:继承重写,或者说接口遵从之后的实现中,存在@Override代码数据获取: [小框架]通过反射获取指定注解中的一些内容,例如 配置,数据,操作,验证。。。
1.3 Java中预定义的一些注解
@Override:重写/实现方法的情况下,检查方法声明是否和父类或者接口中的方法声明一致。强制格式检查。@Deprecated标注当前方法已过时,例如 Data日期类内的一些方法@SuppressWarnings("all")压制警告,可以用于一些代码中存在明确无异常的情况下,压制一些警告

2. Java中自定义注解

2.1 Java中自定义注解的方式
格式:public @interface AnnotationName {属性列表;}Annotation注解是可以编译得到对应的.class字节码文件,验证了注解是可以参与编译过程的?通过反编译工具可以得到一下内容【Annotation本质】public interface MyAnnotation1 extends java.lang.annotation.Annotation {}?MyAnnotation1本质是一个interface,同时java.lang.annotation.Annotation 子接口package com.qfedu.a_annotation.MyAnnotation;?/*** 自定义注解!!!* public interface MyAnnotation1 extends java.lang.annotation.Annotation {* }** @author Anonymous* @date 2020/3/10 11:01*/public @interface MyAnnotation1 {   // 属性 ==> 方法形式}?
2.2 Annotation注解属性【难点】
属性:开发书写代码使用注解的方式中,数据使用方式更加偏向于属性概念。使用 1. 在书写代码中使用@MyAnnotation(id=1, name="骚磊", age=16)2. 利用反射时,会涉及到getXXX方法通过属性名获取对应值的概念来完成的【但是实际上是利用abstract方法来完成属性概念的】?属性使用的格式[实际按照方法格式操作]1. 属性的值数据类型和对应具体数据 ==> 返回值类型和返回的数据属性类型支持:a. 基本数据类型b. String类型c. 其他的注解类型d. 枚举类型 枚举就是一个带有名字的常量,为了更好的域阅读性和操作e. 以上类型对相应的数组属性值要求a. 定义属性时可以使用default关键字,加上默认值,该属性在使用的过程中是没有强制要求属性值,如果没有赋予属性值,采用对应的默认值操作,如果赋值,使用对应值b. 如果注解中有且只有一个value属性,或者说注解中除value属性之外,都有默认值,不管是类,方法,成员变量,包使用当前注解是可以直接在括号内加入对应数据类型数值、c. 如果属性是数组类型, {}大括号保存,并且不同的内容,使用,隔开2. 属性的键名字 ==> 方法的名字
2.3 元注解
给予注解的解释,用于约束注解的一些操作问题@Retention - 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。RetentionPolicy.RUNTIME:当前注解会编译生成对应的.class字节码文件,并且可以加载到JVM中,参与代码执行RetentionPolicy.CLASS: 别纠结,记下就好:RetentionPolicy.SOURCE:注解将被编译器丢弃(该类型的注解信息只会保留在源码里,源码经过编译后,注解信息会被丢弃,不会保留在编译好的class文件里)@Override对应属性RetentionPolicy.SOURCE在代码编译过程中,检查方法格式是否正确,不参与代码运行和解析。@Documented 标记这些注解是否包含在用户文档中。是否可以通过JavaDoc工具,生成对应的API文档@Target 标记这个注解应该是哪种 Java 成员。属性:ElementTypeTYPE: 当前注解可以用于类声明METHOD: 当前注解可以用于方法声明位置FIELD:当前注解可以用于成员变量声明位置@Inherited 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)【重点】@Target目标可以作用范围 类,方法,成员变量...@RetentionRetentionPolicy.RUNTIME 常用


2.4 使用反射获取注解中的内容【用途】
driverClass=com.mysql.jdbc.Driveruser=rootpassword=123456url=jdbc:mysql://localhost:3306/db_name# 配置文件保存到properties文件中,使用文件中内容读取配置获取属性# properties Properties System.getProperties();# Properties ==> driverClass ==> com.mysql.jdbc.Driver ==> 完整的包名.类名# Class.forName package com.qfedu.a_annotation.reflect; import com.qfedu.a_annotation.Person; import java.io.FileInputStream;import java.io.IOException;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.util.Properties; /** * 解析properties文件读取内容,使用反射创建对象,赋值成员变量 * * @author Anonymous */public class ReflectFile {    public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {        Properties properties = new Properties();        properties.load(new FileInputStream("./src/1.properties"));         String className = properties.getProperty("className");        String id = properties.getProperty("id");        String name = properties.getProperty("name");        System.out.println(className);        Class<?> aClass = Class.forName(className);         Person person = (Person) aClass.getConstructor().newInstance();         System.out.println(person);         Field declaredField = aClass.getDeclaredField("id");        declaredField.setAccessible(true);        declaredField.set(person, Integer.parseInt(id));         Field declaredField2 = aClass.getDeclaredField("name");        declaredField2.setAccessible(true);        declaredField2.set(person, name);         System.out.println(person);    }}package com.qfedu.a_annotation.reflect; import com.qfedu.a_annotation.MyAnnotation.MyAnnotation5; import java.io.IOException;import java.lang.reflect.Constructor;import java.lang.reflect.InvocationTargetException; /** * 通过注解方式,获取注解的属性,创建对象,读取数据 * 通常用于代码配置 *      Servlet Listener Filter * @author Anonymous */@MyAnnotation5(className = "com.qfedu.a_annotation.Person",        id = 2,        name = "骚磊")public class ReflectAnnotatiaon {    public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {        // 加载ReflectAnnotatiaon        Class<ReflectAnnotatiaon> cls = ReflectAnnotatiaon.class;         // 因为注解是在类名之上,通过Class获取对应的Annotation        MyAnnotation5 annotation = cls.getAnnotation(MyAnnotation5.class);        /*        类似于注解的实现类        class XXX implements MyAnnotation5 {            public String className() {                return "com.qfedu.a_annotation.Person";            }            public int id() {                return 2;            }            public String name() {                return "骚磊";            }        }         */        // 感觉是在执行对应的方法,获取注解的属性        String s = annotation.className();        int id = annotation.id();        String name = annotation.name();         System.out.println(s);        System.out.println(id);        System.out.println(name);         Class<?> aClass = Class.forName(s);         Constructor<?> constructor = aClass.getConstructor(Integer.class, String.class);         Object o = constructor.newInstance(id, name);        System.out.println(o);    }}
2.5 使用注解测试代码运行【用途】
package com.qfedu.a_annotation.checkMethod; import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target; /** * 没有任何的属性,只是作为是否需要测试的标记 * * @author Anonymous */// 注解有且只能用于方法上@Target(ElementType.METHOD)// 参与编译和运行@Retention(RetentionPolicy.RUNTIME)public @interface Check {}package com.qfedu.a_annotation.checkMethod; import java.io.BufferedWriter;import java.io.FileWriter;import java.io.IOException;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method; /** * 测试Tools类内的方法,如果方法带有Check注解,执行测试,记录异常 * * @author Anonymous */@ClassAnnotation(className = "com.qfedu.a_annotation.checkMethod.Utils")public class TestProject {    public static void main(String[] args)            throws IOException, InvocationTargetException,            IllegalAccessException, ClassNotFoundException, NoSuchMethodException, InstantiationException {         // 从注解中获取对应的属性        Class<TestProject> cls  = TestProject.class;        ClassAnnotation annotation = cls.getAnnotation(ClassAnnotation.class);        String s = annotation.className();        Class<?> aClass = Class.forName(s);         Object tools = aClass.getConstructor().newInstance();        // 获取所有Tools类内的方法,不包括父类方法        Method[] declaredMethods = aClass.getDeclaredMethods();         // 出现错误的次数        int count = 0;        long l = System.currentTimeMillis();        BufferedWriter br = new BufferedWriter(new FileWriter("./src/log.txt"));         // 遍历方法数组        for (Method declaredMethod : declaredMethods) {            declaredMethod.setAccessible(true);             // 判断当前方法是否带有注解@Check,标记            if (declaredMethod.isAnnotationPresent(Check.class)) {                try {                    // 执行方法                    declaredMethod.invoke(tools);                } catch (Exception e) {                    count += 1;                     // 1. 哪一个方法出现异常                    br.write("方法:" + declaredMethod.getName());                    br.newLine();                    // 2. 发生什么异常 获取原因,获取对应的类型                    br.write("异常类型:" + e.getCause().getClass().getSimpleName());                    br.newLine();                    // 3. 异常信息                    br.write("异常信息:" + e.getCause().getMessage());                    br.newLine();                    br.write("-----------------------------------------------------------------");                    br.newLine();                }            }        }         long l1 = System.currentTimeMillis();        br.write("出现错误的次数:" + count);        br.newLine();        br.write("总耗时:" + (l1 - l));        br.newLine();         br.close();    }}

3. 注解使用总结

1. 注解以后大多数情况下,都是使用过程,而不是自定义,会使用到框架中预处理好的注解。2. 注解是给谁用的?                   a. 编译器                   b. 解析代码使用                   c. JVM运行代码使用3. 注解是一个标签,有时候是做标记的,有时候标签是有属性的。

4. 框架是什么

MySQL                   Java连接MySQL                   驱动,数据库用户名,密码,指定的数据库...                   每一次操作都需要程序员自己完成,很麻烦!!! 提供一个模板                   准备好数据,数据库连接给你使用。 数据库操作                   CRUD                   资源处理                   数据解析                   连接对象关闭 提供了一个解决方案                   CRUD的SQL语句                   和对应的参数就OK 框架就是一个半成品的项目,业务逻辑需要程序员自己完成,繁琐操作是有框架完成的。                   JDBC --> JDBCUtils --> DBUtils --> MyBatis --> MyBatis-plus


源码请私信或下载

https://gitee.com/qfjiaoyan/javabase

【免责声明】本文仅代表作者或发布者个人观点,不代表SEO研究协会网(www.seoxiehui.cn)及其所属公司官方发声,对文章观点有疑义请先联系作者或发布者本人修改,若内容涉及侵权或违法信息,请先联系发布者或作者删除,若需我们协助请联系平台管理员,邮箱cxb5918@163.com(本平台不支持其他投诉反馈渠道,谢谢合作)。若需要学习以上相关知识请到巨推学院观看视频教程,网址www.jutuiedu.com。

鸡蛋

鲜花

握手

雷人

路过
已有 7 人参与

会员评论

查看全部评论>>

推荐阅读

    2020-06-02 18:56
  • 作者:wzx59

    PHP中跨域原理以及解决方案

    1.为啥出现跨域在制定Html规则时,为了安全的考虑,一个源的脚本(网页,网站)不能与另一个源的资源进行交互,所以就引发一个词叫做“同源策略”。所谓同源(即指在同一个域),就是两个页面具有相同的协议(protoc

  • 2020-06-02 18:56
  • 作者:seoxuexi

    干货分享!相见恨晚的4款电脑软件,让你的电脑更好用

    每个人电脑里都有各式各样的软件,有办公类、娱乐类、社交类的等等,一款优质的电脑软件,可以让我们的电脑更好用。今天就给大家分享4款相见恨晚的电脑软件,下面我们一起来看看吧!1、 字由字由是一款字体管理软件

  • 2020-06-02 18:26
  • 作者:seoxuexi

    小程序常见的七个推广引流方式

      到目前为止,相信不少企业都已经进行了长沙小程序开发,那么接下来企业要面对的就是,如何对小程序进行推广引流。只有如此,才能为小程序获取到更多忠实用户,使小程序实现更大的价值。有鉴于此,下面长沙小程序

  • 2020-06-02 18:25
  • 作者:Merv

    PC端最好用的优化清理软件,最新破解版助你远离国产流氓软件

    ||“印象小屋”所有资源均在微信公众号~~~【赵先森的藏宝库】免责声明【本文转载于网络仅供参考学习,如有侵权之处请联系删除】THANKS!首先,感谢所有支持本公众号的小伙伴们!也感谢此时正在看文章的你!有了你们

  • 2020-06-02 18:23
  • 作者:lantom

    「抖音」蓝V账号矩阵搭建及应用建议

    1、账号矩阵对于蓝V的优势A、增加品牌曝光;B、通过不同面向实现粉丝积累;C、提升在粉丝面前的活跃度,实现粉丝沉淀;D、通过账号组共同推动活动、tag获取流量;E、一个账号的内容可以作为团队的资源,实现价值最大

  • 2020-06-02 18:12
  • 作者:帅哥网

    《销售技巧》:干销售,这么说话,不成功都难

    情境1:你的价格太贵了1.1 错误应对1、价格好商量…2、对不起,我们是品牌,不讲价;1.2 问题诊断客户买东西时都会想要便宜点,这是客户的一个正常的消费心理,并不是决定他买不买的主要问题。销售人员在接待客户的

  • 2020-06-02 18:07
  • 作者:pmbmeuwpwi

    全省率先!温州出台5G基站建设审批“一件事”改革

    图片来自视觉中国5G基站建设审批,有了一套“温州标准”。5月30日,记者从温州市政务服务局了解到,温州率全省之先推行5G通信基站建设审批“一件事”改革,建立了全市统一、规范、高效的“一件事”审批机制,将审批

  • 2020-06-02 18:07
  • 作者:小仙

    又有女网红揭罗志祥真面目!小猪夜店撩妹对话细节大曝光

    近期娱乐圈最大的“瓜”要数周扬青发公开信曝光前男友罗志祥(小猪)私生活混乱一事。周扬青指罗志祥在与她恋爱的九年里一直对她不忠,与多名女性有不正当关系,甚至与一班好兄弟会开展“多人运动”,而这一切都是她

  • 2020-06-02 18:05
  • 作者:温柔在秋天

    抖音企业号团购配置指南

    一、行业准入要求特别注意:酒、烟、营养品、钟表、珠宝、医疗机构、医疗器械、药品、保健品、医疗服务、化肥农药、化工制品、消毒产品、化工材料、银行、证券、保险、信托、担保、期货、基金、征信机构、贷款、金融

  • 2020-06-02 18:02
  • 作者:alice99shen

    微信小程序切图给api接口设置统一域名

    微信小程序切图给api接口设置统一域名的意义重大,因为小程序api一般在同一个域名下,为了灵活和后期修改域名方便,是非常有必要把域名主体单独封装成一个变量去使用的,这里首先想到的就是app.js下的globalData。在

文章排行

TOP ARTICLES

返回顶部