注解和反射复习

news2024/11/17 5:22:33

注解

注解:给程序和人看的,被程序读取,jdk5.0引用

内置注解

@override:修饰方法,方法声明和重写父类方法,

@Deprecated:修饰,不推荐使用

@suppressWarnings用来抑制编译时的警告,必须添加一个或多个参数@suppressWarnings("all")

元注解:解释其它注解的注解(ps:一个源文件只能有一个public修饰的类)

@Target:描述范围

@Retention:表示需要什么级别保存改注释信息,用于描述注解的声明周期(source(源代码)<class<runtime(运行时))

@Documented主句讲包含在javadoc中

@Inherited:寿命子类可以继承父类中的该注解

定义注解的方式

import java.lang.annotation.*;


public class test01 {
    //注解可以显式赋值,如果没有默认赋值,必须给注释
    @MyAnnotation(name = "强风吹拂" )//必须放在方法上
    public void test() {
    }
    @MyAnnotation1("强风吹拂")//必须放在方法上
    public void test1() {
    }

}
//定义注解:
@Target(value = {ElementType.METHOD,ElementType.TYPE})//可以用在那些地方
@Retention(value = RetentionPolicy.RUNTIME)//注解的生范围生效范围runtime>class>sources
@Documented//别欧式生成javadoc中
@Inherited//子类可以继承到父类中
@interface MyAnnotation{//正常命public @interface,但一个类里面只能又一个
    //注解的参数:参数类型+参数名()
    String name() default "";//defaule默认为空
    int age() default 0;
    int id() default 1;//-1代表不存在
    String[] school() default {"家里蹲","中山大学"};
}
//定义注解:
@Target(value = {ElementType.METHOD,ElementType.TYPE})
@Retention(value = RetentionPolicy.RUNTIME)
@interface MyAnnotation1{
    String value();//如果只有一个值且是value可以少命名,如果是只有一个值但不是value必须命名
}

反射机制(可以获取注解)

静态语言:运行时不改变结构java,c,c++等

动态语言:自身运行改变结构,js,puthon等

正常方式:引入包名->通过new实例化->获取实例对象

反射反射方式:实例化对象->getclass()方法->得到完胜的”包类“名称

        Class c=Class.forName("java.lang.String")

类在加载完之后会产生一个class类型的对象,(一个类只有一个class对象),这一个对象包含完整类的结构信息

主要api

java.lang.Class代表一个类

java.lang.reflect.Method:代表类的方法

java.lang.reflect.Field:代表类的成员变量
java.lang.reflect.Constructor:代表类的构造器

Class方法(ps:要对一个类进行反射,它的有参无参构造器必须要)

class类常用方法
static ClassforName(String name)返回指定类名name的calss对象
Object newInstance()调用缺省构造函数,返回Class对象的一个实体
getName()但会Class对象所表示的实体(类,接口,数组类或void)的名称
Class getSuperClass()返回当前Class对象的父类的Class对象
Class[] getintfaces()获取当前Class对象的接口
ClassLoader getClassLoader()返回该类的类的加载器
Constructor[] getConstructors()返回一个包含某些Constructor对象的数组
Method getMonthed(String name,Class...T)返回Method对象,次对象的形参类型为paramType
Field getDeclaredFields()返回Field对象的一个数组

基本数据类型保存在栈种,并不创建对象,所以不会有hashcode

 可以有class对象

class:外部类,成员(成员内部类,静态内部类),局部内部类,匿名内部类

interface:接口

[]:数组

enum:枚举

annotation:注解:@interface
primitve type:基本数据类型

void

 类加载的过程

类的加载->类的链接->类的初始化

类的加载:将类的class文件读入内存冲,并为值创建一个java.lang.Class对象。由类的加载器生成

类的链接:将类的二进制聚合到JRE种(分配内存,并设置类变量默认初始值阶段)

类的初始化:jvm负责类的进行初始化(编译器自动收集类变量的赋值和静态代码块种的语句合并生成)类的
主动初始化虚拟机启动,先初始化main方法所在的类

new一个类的对象

调用静态成员(除了final常量)和静态方法
使用java.lang.reflect包的方法进行对类的反射调用

当初是化一个类的时候,如果其父类没有被初始化,则先回初始化它的父类

类的被动初始化

当访问一个静态域时,只有振声声明这个域的类才会被初始化,当子类引用父类的静态变量,不会导致子类初始化

通过数组定义类引用,不回触发此类的初始化

引用常量不会触发此类的初始化(常量在链接阶段就存入调用类的常量池种)

类的加载器

类加载的作用:将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后在堆中生成一个代表这个类的java.lang.Class对象作为方法区中数据的访问入口

类的缓存:javase中可按照要求查找类,一旦某个类被加载到加载器中,讲维持(缓存)一段时间。JVM垃圾回收机制可以回收这些Class对象

获取运行是类的完整结构

Field(属性),Method,Consturctors,SuperClass,interface,Annotation

创建类的对象,调用Class对象的newInstance()

1. 一个类必须有无参构造器

2.类的访问权限要够用

实体

通过反射调用方法:invoke

通过反射操作属性:setAccessible:默认false开启,true是关闭

反射操作注解(重要)

getAnnocations

getAnnotation

import java.lang.annotation.*;
import java.lang.reflect.Field;

public class test5 {
    public static void main(String[] args) throws NoSuchFieldException {
        Class<Student> studentClass = Student.class;
        //通过注解获得值
        Annotation[] annotation = studentClass.getAnnotations();
        for (Annotation annotation1 : annotation) {
            System.out.println(annotation1);
        }
        //通过注解活得value值
        Tablefeng annotation1 = studentClass.getAnnotation(Tablefeng.class);
        String value = annotation1.value();
        System.out.println(value);
        //活得类指定的注解
        Field name = studentClass.getDeclaredField("name");
        Fieldfeng annotation2 = name.getAnnotation(Fieldfeng.class);
        System.out.println(annotation2.ColumnName());
        System.out.println(annotation2.length());
        System.out.println(annotation2.type());
    }
}
@Tablefeng("tableStudent")
class Student {
    @Fieldfeng(ColumnName="id",type="int",length=12)
    private int id;
    @Fieldfeng(ColumnName="age",type="int",length=12)
    private int age;
    @Fieldfeng(ColumnName="name",type="String",length=12)
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}
//类名的注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface Tablefeng{
    String value();
}

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface Fieldfeng{
    String ColumnName();
    String type();
    int length();
}

返回结果:

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

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

相关文章

外贸客户背调的几种干货技巧

外贸人要想做到知己知彼&#xff0c;那背调是必不可少的。 有经验的外贸人会通过关键词、邮箱等开展模糊搜索&#xff0c;然而这种方式不光效率低&#xff0c;而且搜索到的信息也不全。今天小编分享的这几种背调组合工具&#xff0c;不光收集到的客户信息全面&#xff0c;而且…

Nginx网络服务的配置(叫不醒和睡不着的是两个世界)

文章目录 一、Nginx概述二、Nginx相对于Apache的优点三、配置Nginx网络服务1.编译安装和启用Nginx服务&#xff08;1&#xff09;关闭防火墙和selinux&#xff08;2&#xff09;安装依赖包&#xff08;3&#xff09;创建运行用户、组&#xff08;Nginx 服务程序默认以 nobody 身…

华为OD机试真题B卷 Java 实现【机房布局】,附详细解题思路

一、题目描述 小明正在规划一个大型数据中心机房&#xff0c;为了使得机柜上的机器都能正常满负荷工作&#xff0c;需要确保在每个机柜边上至少要有一个电箱。 为了简化题目&#xff0c;假设这个机房是一整排&#xff0c;M表示机柜&#xff0c;I表示间隔&#xff0c;请你返回…

北斗RTK差分定位技术原理、优势及应用领域

北斗卫星导航系统是中国自主建设的卫星导航系统&#xff0c;是继美国GPS、俄罗斯GLONASS和欧盟Galileo之后&#xff0c;全球第四个卫星导航系统。北斗系统非常重要&#xff0c;可用于国防、公共安全、民生等多个领域&#xff0c;包括交通运输、环境保护、渔业等。差分定位则是北…

【Springboot系列】springboot扩展点大整理,赶紧收藏起来

系列文章&#xff1a;Spring Boot学习大纲&#xff0c;可以留言自己想了解的技术点 1、aware系列 在Spring Boot中&#xff0c;有一些可以实现的Aware接口&#xff0c;用于在应用程序中获取特定的上下文或对象。这些接口允许您的组件意识到它们所在的环境&#xff0c;并与之进…

和数集团元宇宙场景落地 催生新机遇

现代社会随着科技不断发展&#xff0c;人们对于虚拟现实的需求日益提高。随着互联网进入Web3.0时代&#xff0c;越来越多的人开始进入虚拟世界&#xff0c;探索虚拟现实的无限可能。 在这个充满未知的广阔世界中&#xff0c;和数集团旗下包括【神念无界源起山海】、【神宠岛】…

国内使用chatGPT插件

无需任何繁琐操作&#xff0c;只要你一打开edge浏览器就能使用chatGPT&#xff0c;还要什么自行车&#xff01; 那么如何使用呢&#xff1f;其实操作是非常简单的&#xff01; 步骤 第一步&#xff1a;下载edge浏览器 edge浏览器一般Windows10系统都自带了&#xff0c;没有的…

ChatGPT 提示的艺术 —— 如何编写清晰有效提示指南

ChatGPT 提示的作用 正如我们之前提到的那样&#xff0c;ChatGPT 对话中使用的提示的质量可以显著影响对话的成功。定义清晰的提示可以确保对话保持在正确的轨道上&#xff0c;并涵盖用户感兴趣的主题&#xff0c;从而产生更引人入胜和信息丰富的体验。 那么什么样的 ChatGPT…

计算机网络实验:认识Packet Tracer软件

目录 前言实验目的实验内容及要求相关知识点实验指导实验过程总结 前言 计算机网络是当今信息技术的重要组成部分&#xff0c;它涉及到多种硬件和软件的协同工作&#xff0c;以实现数据的传输和交换。为了更好地理解和掌握计算机网络的基本原理和技术&#xff0c;我们需要进行…

关于分数的二进制原反补码的求解

话不多说&#xff0c;上例子 求-53/64的原反补&#xff1b; 前奏&#xff1a;-53/64可以分解为符号位“-”和数字位53/64&#xff1b; 第一步&#xff1a;在计算机中&#xff0c;符号位用0表示“”用1表示“-” 第二步&#xff1a;求53/64的二进制数&#xff0c;过程如下图…

如何回馈 Elastic 社区

作者&#xff1a;Ully Sampaio 在 Elastic 社区中拥有前排座位最美妙的事情之一就是见证人们互相帮助。 从讨论和 Elastic Community Slack 工作区到 Elastic YouTube 官方频道&#xff0c;无论你走到哪里&#xff0c;你都会看到 Elasticsearch 专家和初学者分享他们的知识。 这…

图解LeetCode——543. 二叉树的直径

一、题目 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 二、示例 2.1> 示例 1&#xff1a; 【输入】roo…

Vision Transformer (ViT)及各种变体

目录 0.Vision Transformer介绍 1.ViT 模型架构 1.1 Linear Projection of Flattened Patches 1.2 Transformer Encoder 1.3 MLP Head 1.4 ViT架构图 1.5 model scaling 2.Hybrid ViT 4.其他Vision Transformer变体 5.Vit代码 6.参考博文 0.Vision Transformer介绍 …

样本不平衡的解决办法

背景 Focal loss是最初由何恺明提出的&#xff0c;最初用于图像领域解决数据不平衡造成的模型性能问题。本文试图从交叉熵损失函数出发&#xff0c;分析数据不平衡问题&#xff0c;focal loss与交叉熵损失函数的对比&#xff0c;给出focal loss有效性的解释。 交叉熵损失函数…

危机先知:TOOM舆情监控助力风险预警

随着社交媒体和互联网的普及&#xff0c;公众的声音在网络上如洪水般涌现。这些声音传递着情绪、态度和观点&#xff0c;对个人、组织甚至整个社会产生着巨大影响。因此&#xff0c;舆情监控成为了一个不可或缺的工具&#xff0c;帮助企业和组织及时了解公众对其品牌、产品或服…

决策树基本理论知识

目录 1、决策树是一种树模型 2、决策树的训练与测试 3、信息增益&#xff08;ID3&#xff09; 3.1、衡量标准-熵 3.2、决策树构造实例 4、决策树算法 ​5、连续值离散化 6、预剪枝 1、决策树是一种树模型&#xff1a; &#xff08;1&#xff09;、从根结点开始一步步走…

【C++】哈希表封装unordered系列

文章目录 前言一、哈希表的封装总结 前言 在看本篇文章前大家尽量拿出上一篇文章的代码跟着一步步实现&#xff0c;否则很容易引出大量模板错误而无法解决。 一、哈希表的封装 首先我们要解决映射的问题&#xff0c;我们目前的代码只能映射整形&#xff0c;那么如何支撑浮点数…

Java使用zxing.jar生成二维码

由于时代科学的进步&#xff0c;二维码已经和我们的生活密不可分&#xff0c;在开发过程中往往会涉及到和二维码相关的开发&#xff0c;今天这篇文章就教会大家如何使用zxing.jar包生成二维码 下面这个就是百度上面自带的一个生成二维码的功能&#xff0c;那他是怎么实现这个功…

计算机组成原理与体系结构概述

目录 一、计算机的发展 二、计算机的硬件系统 三、硬件的工作原理 四、计算机系统的层次结构 五、计算机的性能指标 一、计算机的发展 第一代计算机&#xff1a;电子管计算机 第一台电子计算机&#xff1a;ENIAC&#xff08;1946&#xff09; 设计目的&#xff1a;计算导弹…

平板触控笔哪种好?主动式电容笔推荐

现在市面上的电容笔分为主动式和被动式电容笔&#xff0c;很多小伙伴都分不清主动式和被动式电容笔的区别。今天给大家介绍一下这两款电容笔的区别。给大家分享几款好用的平替电容笔。 一、主动式电容笔和被动式电容笔的区别&#xff1a; 1.主动式电容笔&#xff1a; 主动式电…