爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      第十九章《类的加载与反射》第4节:注解

      首页 知识中心 软件开发 文章详情页

      第十九章《类的加载与反射》第4节:注解

      2023-03-21 10:39:47 阅读次数:523

      注解,Java

      在8.10小节曾经简单的介绍过注解,但当时只是简单的介绍了3个注解的作用,本小节将详细讲解注解的相关知识。注解始于JDK1.5,在Java语言中以Annotation接口表示注解。注解其实是代码里的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理。通过使用注解,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充的信息。代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证或者进行部署。

      注解就像修饰符一样,可以用于修饰包、类、构造方法、普通方法、属性、参数以及局部变量,这些信息被存储在注解的“name=value”对中。需要注意:注解不影响程序代码的执行,无论增加、删除注解,代码都始终如一地执行。如果希望让程序中的注解在运行时起一定的作用,只有通过某种配套的工具对注解中的信息进行解析和处理,或者以反射的方式对注解信息做出专门解析和处理。

      19.4.1基本注解

      在程序中如果需要使用注解,也需要向引入类一样进行引入操作。java.lang包下有5个注解,这5个注解不需要进行引入就能直接使用,因此它们也被称为“基本注解”。基本注解有:@Override、@Deprecated、@SuppressWarnings、@SafeVarargs和@FunctionalInterface,这5个基本注解中有4个已经在第8章中进行了讲解,只有@SafeVarargs没有介绍过。

      @SafeVarargs注解用来抑制“堆污染”警告。什么是“堆污染”呢?在使用集合时,如果没有用泛型对集合进行元素类型限制有可能导致运行时出现异常,例如:

      List list1 = new ArrayList<Integer>() ;​
      list1.add(20) ;// ①添加元素时引发unchecked异常​
      //下面代码引起“未经检查的转换"的警告,编译、运行时完全正常​
      List<String> list2 = list1;//②​
      //但只要访问list2里的元素,如下面代码就会引起运行时异常​
      System.out.println(list2.get(0));//③​
      

      以上代码中,语句②不会因list1和list2所指定的泛型不同而导致语法错误,因此语句②可以通过编译并能成功运行,但在运行③时则会出现异常。引起语句③在运行时出现异常的原因是编译器没有对语句②进行严格的泛型检查,导致没有指定泛型的集合引用能够指向指定了泛型的集合对象,语句②就是典型的这种情况。专业上,把指定了泛型的集合对象赋值给没有指定泛型的集合引用称为“堆污染”。

      从JDK1.7开始对可能产生的堆污染提出警告,但这种警告仅有一种情况,那就是方法参数的类型是泛型类且是可变参数,例如:

      public static void faultyMethod1(List<String>... listStrArray)//① ​
      {​
          List[] listArray = listStrArray;//②​
          listArray[0].add(new Integer(1));//③​
      }​
      public static void faultyMethod2(List<String> list)//④ ​
      {​
          List myList = list;//⑤​
      }​
      

      在以上代码中,标记为①的位置会产生警告,警告的内容是“Type safety: Potential heap pollution via varargs parameter listStrArray”,意思是可变参数“listStrArray可能导致堆污染”。这个警告提示了程序员一种可能存在的风险,下面的语句②进行了堆污染的操作并不会被编译器判断为语法错误,而语句③则会导致运行时程序出现异常,因此警告的出现就是为了避免这种情况的发生。需要注意:编译器仅对参数是泛型类且是可变参数的情况发出堆污染警告,代码中标记为④的位置,参数list在语句⑤中赋值给原始类型的myList虽然也会导致堆污染,但并不会导致编译器发出警告。

      消除堆污染警告可以有两种方式,分别是使用@SafeVarargs和@SuppressWarnings("unchecked")进行压制。但@SafeVarargs使用上有比较严格的限制:

      • @SafeVarargs只能用于方法,不能用于语句或类
      • 方法必须被static或final关键字所修饰
      • 方法中必须含有泛型类参数,且参数必须是可变类型

      以上代码中的faultyMethod1()方法就符合添加@SafeVarargs注解的条件,读者可以自己添加这个注解并观察消除警告的效果。

      19.4.2元注解

      Java语言除在java.lang下提供了5个基本的注解之外,还在java.lang.annotation包下提供了6个元注解。元注解的作用是负责对他注解进行注解,也就是为其他注解提供了相关的解释说明。

      首先介绍的是@Retention,@Retention只能用于修饰注解定义,用于指定被修饰的注解可以保留多长时间。@Retention包含一个RetentionPolicy类型的value属性,所以使用@Retention时必须为该value属性指定值。value的值只能是以下三个,如表19-6所示。

      表19-6 @Retention的value值

      value值 意义
      RetentionPolicy.CLASS 编译器将把注解记录在class文件中。当运行Java程序时,JVM不可获取注解信息。这是默认值
      RetentionPolicy.RUNTIME 编译器将把注解记录在class文件中。当运行Java程序时,JVM也可获取注解信息,程序可以通过反射获取该注解信息
      RetentionPolicy.SOURCE 注解只保留在源代码中,编译器直接丢弃这种注解

      从表19-6可以看出:如果需要通过反射获取注解信息,就需要使用value 属性值为RetentionPolicy.RUNTIME 的@Retention。使用@Retention元注解可采用如下代码为value指定值。

      Retention (value= RetentionPolicy.RUNTIME )​
      public @interface​
      Testable{ }​
      

      以上代码中,Testable是一个自定义的注解,在它上面的Retention注解表明Testable注解一直可被保留到程序运行时,如果希望注解仅在源代码中出现,编译时被丢弃,则可以把以上代码修改为:

      Retention (value= RetentionPolicy.SOURCE)​
      public @interface​
      Testable{ }​
      

      实际上,指定注解value值时可以不用“name=value”的形式,也即可以把注解直接写为:

      Retention (RetentionPolicy.SOURCE)​
      

      接下来讲解@Target注解。@Target也只能修饰注解定义,它用于指定被修饰的注解能用于修饰哪些程序单元。@Target元注解也包含一个名为value 的属性,该属性的值只能是以下几个,如表19-7所示。

      表19-7 @Target的value值

      value值 意义
      ElementType.ANNOTATION _TYPE 指定该策略的注解只能修饰注解
      ElementType.CONSTRUCTOR 指定该策略的注解只能修饰构造方法
      ElementType.FIELD 指定该策略的注解只能修饰属性
      ElementType.LOCAL_ VARIABLE 指定该策略的注解只能修饰局部变量
      ElementType.METHOD 指定该策略的注解只能修饰方法定义
      ElementType.PACKAGE 指定该策略的注解只能修饰包定义
      ElementType.PARAMETER 指定该策略的注解可以修饰参数
      ElementType.TYPE 指定该策略的注解可以修饰类、接口(包括注解类型)或枚举定义

      与@Retention相同,使用@Target也可以直接在括号里指定value值,而无须使用“name=value”的形式。下面的代码指定@ ActionListenerFor注解只能修饰属性。

      @Target (ElementType.FIELD)​
      public @interface ActionListenerFor{ }​
      

      下面的代码片段指定@Testable注解只能修饰方法。

      @Target (ElementType.METHOD)​
      public @interface Testable { }​
      

      下面介绍@Document注解。@Documented用于指定被该元注解修饰的注解类将被javadoc工具提取成文档,如果定义注解类时使用了@Documented修饰,则所有使用该注解修饰的程序元素的API文档中将会包含该注解说明。

      下面代码定义了一个Testable注解,代码中使用@Documented来修饰@Testable注解定义,所以该注解将被javadoc工具所提取。

      @Retention (RetentionPolicy . RUNTIME)​
      @Target (E1 ementType.METHOD)​
      //定义Testable注解将被javadoc工具提取​
      @Documented​
      public @interface Testable​
      {​
      }​
      

      最后介绍@Inherited注解。@Inherited注解指定被它修饰的注解将具有继承性,即如果某个类使用了@Xxx注解(定义该注解时使用了@Inherited修饰)修饰,则其子类将自动被@Xxx修饰。

      下面使用@Inherited元注解修饰@Inheritable定义,则该注解将具有继承性。

      @Target(ElementType.TYPE)​
      @Retention(RetentionPolicy.RUNTIME)​
      @ Inherited​
      public @interface Inheritable​
      {​
      }​
      

      以上程序中,自定义的Inheritable注解被@ Inherited注解修饰,这说明@Inheritable具有继承性,如果某个类使用了@Inheritable修饰,则该类的子类将自动使用@Inheritable修饰。

      19.4.3自定义注解

      自定义注解类型使用@interface关键字,定义一个新的注解与定义一个接口非常像,下面的代码可定义一个简单的注解类型。

      public @interface Test{​
      }​
      

      定义了该注解之后,就可以在程序的任何地方使用该注解。使用注解的语法非常类似于public、final这样的修饰符,通常可用于修饰程序中的类、方法、变量、接口等定义。通常会把注解放在所有修饰符之前,而且由于使用注解时可能还需要为属性指定值,因而注解的长度可能较长,所以通常把注解另放一行,如下面的代码所示。

      //使用@Test修饰类定义​
      @Test​
      public class MyClass{​
      }​
      

      在默认情况下,注解可用于修饰任何程序元素,包括类、接口、方法等,下面的代码是使用@Test来修饰方法。

      public class t MyClass{​
       //使用CTest注解修饰方法​
       @Test​
       public void info(){​
       }​
      }​
      

      注解不仅可以是这种简单的注解,还可以带属性,属性在注解定义中以无形参的方法形式来声明,其方法名和返回值定义了该属性的名字和类型。如下代码可以定义一个有属性的注解。

      public @interface MyTag{ ​
          //定义带两个属性的注解​
          //注解中的属性以方法的形式来定义​
          String name() ;​
          int age() ;​
      }​
      

      一旦在注解里定义了属性之后,使用该注解时就应该为它的属性指定值,例如:

      public class Test{​
          //使用带属性的注解时,需要为属性赋值​
          @MyTag (name="xx", age=6)​
          public void info(){​
          }​
      }​
      

      如果只有一个属性需要赋值,并且属性的名称是,value,则value可以省略,直接定义值即可,例如之前介绍的@ Retention注解就是如此。

      程序员也可以在定义注解的属性时为其指定初始值(默认值),指定属性的初始值可使用default关键字。下面的代码定义了@MyTag注解,该注解里包含了两个属性: name 和age,这两个属性使用default指定了初始值。

      public @interface MyTag{​
          //定义了两个属性的注解​
          //使用default为两个属性指定初始值​
          String name() default "Jack" ;​
          int age() default 22;​
      }​
      

      如果为注解的属性指定了默认值,使用该注解时则可以不为这些属性指定值,而是直接使用默认值。

      根据注解是否可以包含成员变量,可以把注解分为如下两类:

      • 标记注解:没有定义成员变量的注解类型被称为标记。这种注解仅利用自身的存在与否来提供信息,如前面介绍的@Override、@Test 等注解。
      • 元数据注解:包含成员变量的注解,因为它们可以接受更多的元数据,所以也被称为元数据注解。

      使用注解修饰了类、方法、成员变量等成员之后,这些注解不会自己生效,必须由开发者提供相应的工具来提取并处理注解信息。Java使用java.lang. annotation.Annotation接口来代表程序元素前面的注解,该接口是所有注解的父接口。JDK1.5在java.lang.reflect包下新增了AnnotatedElement 接口,该接口代表程序中可以接受注解的程序元素。该接口主要的实现类有:Class、Constructor、Field、Method、Package,它们分别代表类、构造方法、属性、普通方法、包。这些类在之前讲解反射相关知识时都已经讲解过,并且也讲解了如何通过反射的方式读取注解。下面的【例19_14】展示了自定义注解在实际开发过程中是如何标识某个方法是可测试的。

      【例19_14 自定义注解应用】

      Exam19_14.java

      import java.lang.annotation.*;
      import java.lang.reflect.*;
      //使用@Retention指定注解的保留到运行时
      @Retention(RetentionPolicy.RUNTIME )
      //使用@Target指定被修饰的注解可用于修饰方法
      @Target (ElementType.METHOD)
      //定义一个标记注解,不包含任何成员变量,即不可传入元数据
      @interface Testable{
      }
      class MyTest{
          @Testable
          public  static void m1(){}
          public  static void m2(){}
          @Testable
          public  static void m3(){ throw new IllegalArgumentException("参数异常!");}
          public  static void m4(){}
          @Testable
          public  static void m5(){}
          public  static void m6(){}
          @Testable
          public  static void m7(){throw new RuntimeException("业务出现异常!");}
          public  static void m8(){}
      }
      public class Exam19_14 {
          public static void process (String clazz) throws ClassNotFoundException{
              int passed = 0;
              int failed = 0;
              //遍历clazz对应的类里的所有方法
              for (Method m : Class. forName (clazz) . getMethods() ) {
                  //如果该方法使用了@Testable修饰
                  if (m.isAnnotationPresent(Testable.class)) {
                      try {
                          //调用m方法
                          m.invoke(null);
                          //测试成功,passed计数器加1
                          passed++;
                      } catch (Exception e) {
                          System.out.println("方法" + m + "运行失败,异常:" + e.getCause());
                          // 测试出现异常, failed计数器加1
                          failed++;
                      }
                  }
              }
              //统计测试结果
              System.out.println("共运行了:" + (passed + failed) + "个方法,其中"
                      + "失败了" + failed + "个," + "成功了" + passed + "个! ");
          }
      
          public static void main(String[] args) throws Exception{
              process("MyTest");
          }
      }
      

      【例19_14】中,MyTest类有很多方法,那些被@ Testable注解标记的方法是可以测试的方法。在Exam19_14类的process()方法中用反射的方式获取了MyTest类中的所定义的方法,并依次检查这些方法是否有@ Testable注解,如果有@ Testable注解,则认为它是一个可以测试的方法,并以反射的形式运行了这些可测试的方法以检测这些方法是否能运行成功。【例19_14】的运行结果如图19-15所示。

      第十九章《类的加载与反射》第4节:注解

      图19-15【例19_14】运行结果

      通过上面例子读者不难看出,其实注解十分简单,它是对源代码增加的一些特殊标记,这些特殊标记可通过反射获取,当程序获取这些特殊标记后,程序可以做出相应的处理。

      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.51cto.com/mugexuetang/5985279,作者:穆哥学堂,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:0030 简单的四则运算 c/c++

      下一篇:第十九章《类的加载与反射》第2节:类加载器

      相关文章

      2025-05-14 10:03:13

      arm架构下JAVA开发

      ARM(Advanced RISC Machine)是一种基于精简指令集计算(RISC)设计的处理器架构。它以高效、节能著称,因此广泛应用 于从智能手机到物联网设备的各个领域。

      2025-05-14 10:03:13
      Java , JVM , 嵌入式 , 架构 , 设备
      2025-05-14 10:02:58

      Java实现根据概率中奖率怎么算

      要实现根据概率计算中奖率的功能,可以使用 Java 编程语言编写一个简单的程序。

      2025-05-14 10:02:58
      Java , 概率 , 模拟 , 程序
      2025-05-14 09:51:21

      Java 代码本地设置Hadoop用户名密码

      在Hadoop环境中,通常使用Kerberos进行身份验证。但在一些开发或测试环境中,我们可能需要在本地代码中设置用户名和密码来模拟或进行简单的测试。

      2025-05-14 09:51:21
      Hadoop , Java , 代码 , 使用 , 用户名 , 认证
      2025-05-14 09:51:21

      java 判断map为null或者空

      java 判断map为null或者空

      2025-05-14 09:51:21
      Java , Map , null , 方法 , 是否 , 检查 , 示例
      2025-05-14 09:51:15

      java怎么对线程池做监控

      对Java线程池进行监控是确保系统性能和稳定性的重要部分。监控线程池可以帮助我们了解线程池的状态,如当前活跃线程数、任务队列长度、已完成任务数等。

      2025-05-14 09:51:15
      Java , 方法 , 监控 , 示例 , 线程 , 队列
      2025-05-13 09:53:23

      java动态获取实体类的字段

      在Java中,我们可以使用反射(Reflection)API来动态地获取实体类的字段。

      2025-05-13 09:53:23
      API , Java , 使用 , 字段 , 实体类 , 方法 , 获取
      2025-05-13 09:53:23

      Java静态变量在静态方法内部无法改变值

      在Java中,静态变量(也称为类变量)属于类本身,而不是类的任何特定实例。它们可以在没有创建类的实例的情况下访问和修改。如果我们发现在静态方法内部无法改变静态变量的值,这通常是因为我们的代码中有一些逻辑错误或误解。

      2025-05-13 09:53:23
      Java , 变量 , 实例 , 类名 , 访问 , 静态 , 静态方法
      2025-05-12 10:19:12

      SpringBoot学习(6)(Bean对象扫描)(@ComponentScan)

      SpringBoot学习(6)(Bean对象扫描)(@ComponentScan)

      2025-05-12 10:19:12
      Bean , springboot , 启动 , 扫描 , 注解
      2025-05-12 10:19:12

      springboot学习(2)

      springboot学习(2)

      2025-05-12 10:19:12
      Java , main , springboot , web , 启动 , 方法 , 浏览器
      2025-05-08 09:03:21

      基于spring+jsp+mysql实现的Java web论坛系统【源码+数据库+指导运行】

      本项目是一套基于spring+jsp+mysql实现的Java web论坛系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。

      2025-05-08 09:03:21
      Java , jsp , spring , 功能 , 源码
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5250819

      查看更多

      最新文章

      arm架构下JAVA开发

      2025-05-14 10:03:13

      Java实现根据概率中奖率怎么算

      2025-05-14 10:02:58

      Java 代码本地设置Hadoop用户名密码

      2025-05-14 09:51:21

      java 判断map为null或者空

      2025-05-14 09:51:21

      java怎么对线程池做监控

      2025-05-14 09:51:15

      java动态获取实体类的字段

      2025-05-13 09:53:23

      查看更多

      热门文章

      Java线程同步synchronized wait notifyAll

      2023-04-18 14:15:05

      Java/Android Annotation注解/注入(二)

      2023-04-13 09:37:00

      Android/Java判断字符串String是否为float浮点数或double类型

      2023-04-17 09:39:54

      Java小数点数字和百分号数字之间的转换

      2023-04-13 09:48:57

      Java的自带注解Annotation(一)

      2023-05-10 06:02:06

      Java/Android Annotation注解/注入(三)

      2023-04-13 09:37:00

      查看更多

      热门标签

      java Java python 编程开发 代码 开发语言 算法 线程 Python html 数组 C++ 元素 javascript c++
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      【Java并发编程】之二十三:并发新特性—信号量Semaphore(含代码)

      Java 应用的资源管理:连接池与线程池

      Java|获取图片rgb值

      Java中的Set(如果想知道Java中有关Set的知识点,那么只看这一篇就足够了!)

      如何自定义一个starter步骤详解

      心中的TOP1编程语言——Java语言

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号