注解和反射04(Java)

news2024/11/26 13:37:48

#拓展

获取泛型信息

反射操作泛型:

package reflection;

import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;

//通过反射获取泛型
public class Test06{
    public void test01(Map<String,User> map, List<User> list){
        System.out.println("test01");
    }
    public Map<String,User> test02(){
        System.out.println("test02");
        return null;
    }

    public static void main(String[] args) throws NoSuchMethodException {
        Method method = Test06.class.getMethod("test01", Map.class, List.class);

        Type[] genericParameterTypes = method.getGenericParameterTypes();
        for (Type genericParameterType : genericParameterTypes){
            System.out.println("#"+genericParameterType);
            if(genericParameterType instanceof ParameterizedType){
                Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments();
                for (Type actualTypeArgument : actualTypeArguments){
                    System.out.println(actualTypeArguments);
                }
            }
        }
        method = Test06.class.getMethod("test02",null);
        Type genericReturnType = method.getGenericReturnType();
        if(genericReturnType instanceof ParameterizedType){
            Type[] actualTypeArguments = ((ParameterizedType)genericReturnType).getActualTypeArguments();
            for(Type actualTypeArgument : actualTypeArguments){
                System.out.println(actualTypeArgument);

            }
        }

    }


}

获取注解信息:

了解什么是ORM

Object relationship Mapping ---->对象关系映射

要求:利用注解和反射完成类和表结构的映射关系

package reflection;

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

//练习反射操作注解
public class Test07 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
        Class c1 = Class.forName("reflection.Student2");

        //通过反射获得注解
        Annotation[] annotations = c1.getAnnotations();
        for (Annotation annotation : annotations){
            System.out.println(annotation);
        }

        //获得注解value的值
        TableZ tableZ = (TableZ)c1.getAnnotation(TableZ.class);
        String value = tableZ.value();
        System.out.println(value);

        //获得类指定的注解
        Field f = c1.getDeclaredField("name");
        FieldZ annotation = f.getAnnotation(FieldZ.class);
        System.out.println(annotation.columnName());
        System.out.println(annotation.type());
        System.out.println(annotation.length());
    }
}

@TableZ("db_student")
class Student2{
    @FieldZ(columnName = "db_id",type = "int",length = 10)
    private int id;
    @FieldZ(columnName = "db_age",type = "int",length = 10)
    private int age;
    @FieldZ(columnName = "db_name",type = "varcher",length = 3)
    private String name;

    @Override
    public String toString() {
        return "Student2{" +
                "id=" + id +
                ", age=" + age +
                ", name='" + 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;
    }

    public Student2(int id, int age, String name) {
        this.id = id;
        this.age = age;
        this.name = name;
    }
    public Student2() {
    }

}

//类名的注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface TableZ{
    String value();
}

//属性的注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface FieldZ{
    String columnName();
    String type();
    int length();
}

field.getAnnotation是Java中的一个方法,用于获取一个字段的注解。它可以通过反射机制获取指定字段上的注解信息,并返回一个Annotation对象。在使用该方法时,需要传入一个注解类型的Class对象作为参数,以指定要获取的注解类型。如果指定的字段上没有该注解,则返回null。

Class.getAnnotations() 获取所有的注解,包括自己声明的以及继承的
Class.getAnnotation(Class< A > annotationClass) 获取指定的注解,该注解可以是自己声明的,也可以是继承的
Class.getDeclaredAnnotations() 获取自己声明的注解
 

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

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

相关文章

进制转换解析

进制 进制介绍 对于整数&#xff0c;有四种表示方式&#xff1a; 二进制&#xff1a;0,1 &#xff0c;满 2 进 1.以 0b 或 0B 开头。 十进制&#xff1a;0-9 &#xff0c;满 10 进 1。 八进制&#xff1a;0-7 &#xff0c;满 8 进 1. 以数字 0 开头表示。 十六进制&#xff1…

力扣题库刷题笔记42--接雨水(未通过)

1、题目如下&#xff1a; 2、个人Python代码实现&#xff08;部分用例超时&#xff09; 本地执行大概超过30S&#xff0c;力扣显示超时 3、个人Python代码思路&#xff1a; 当且仅当nums[i] < nums[i1]&#xff0c;nums[i] < nums[i-1]&#xff0c;此时nums[i]才能接到雨…

运动规划概述

运动规划概述 前端路径搜索后端轨迹生成MPD & MPC地图表示多智能体路径规划MAPF 前端路径搜索 不希望花费太多的算力和代价&#xff0c;因此通常把高维问题降成低维问题&#xff0c;先找到一条粗劣可行的低维解。 基于搜索的路径规划 图搜索问题 Dijkstra and A* 、 Jump…

第四十六章Java包(package)

在编写 Java 程序时&#xff0c;随着程序架构越来越大&#xff0c;类的个数也越来越多&#xff0c;这时就会发现管理程序中维护类名称也是一件很麻烦的事&#xff0c;尤其是一些同名问题的发生。有时&#xff0c;开发人员还可能需要将处理同一方面的问题的类放在同一个目录下&a…

python相关

1 首先下载python环境 win r 输入python 下载对应版本的环境 建议使用python3以上的版本。 2 windows环境下安装selenium 安装easy_install https://pypi.python.org/pypi/setuptools在此链接 然后python setup.py&#xff0c;看到了以下字样&#xff0c;则表明成功 这里需…

16万字市智慧人社项目建设方2023WORD

导读&#xff1a;原文《16万字市智慧人社项目建设方2023WORD》word&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 目 录 第 1 章 项目概述 1.1 项目名称 1.2 …

串行FLASH文件系统FatFs-移植过程

目录 串行FLASH文件系统FatFs-移植过程 准备工作及移植前说明 底层disk接口程序API配置 中间层API功能实现及常用文件操作函数使用 文件系统偏移 中文文件名和长文件名 串行FLASH文件系统FatFs-移植过程 准备工作及移植前说明 我们需要在SPI——读写串行FLASH的基础驱动程…

winform打印机控制程序记录

1.Invoke 跨线程访问 有些回调函数不能直接访问控件的属性&#xff0c;这时就需要用到这个。 用法&#xff1a; Invoke(new Action(() >{//正常代码receiveCount;tb_recvCount.Text Convert.ToString(receiveCount);}));2.控制打印机打印 2.1.绘制表格 准备一个 panel …

Redis---缓存双写一致性

目录 一、什么是缓存双写一致性呢&#xff1f; 1.1 双检加锁机制 二、数据库和缓存一致性的更新策略 2.1、先更新数据库&#xff0c;后更新缓存 2.2 、先更新缓存&#xff0c;后更新数据库 2.3、先删除缓存&#xff0c;在更新数据库 延时双删的策略&#xff1a; 2.4.先更新数…

手把手一起完成Python上位机与下位机USB通信

前言 最近在使用Python设计上位机&#xff0c;下位机是ZYNQ7000&#xff0c;两者通过USB进行数据传输。该文章是USB通信过程的踩坑记录 一、安装所需库 首先&#xff0c;安装pyusb和libusb两个库&#xff0c;命令如下&#xff1a; pip install pyusbpip install libusb如图…

CUDA笔记2

1.硬件理解 1.1对应 1.2 不一定是同时执行 例如只有13个sm,每个sm有128个core,而我们创建了1百万个threads,就要同步执行 因此&#xff0c;我们倾向于在block的x维设置为32的倍数,防止浪费warp warp id打印 #include <stdio.h> #include <stdlib.h>#include &qu…

Acwing 849. Dijkstra求最短路 I

Acwing 849. Dijkstra求最短路 I 链接:849. Dijkstra求最短路 I - AcWing题库 /*题解:dijkstra算法模板对于单源最短路径dijkstra1.每次找到当前距离源最近的节点 作为确定距离的点2.通过这个点看能否让其他的节点来松弛其他点到源的距离重复12操作*/ #include<algorithm&g…

完美解决win10系统cmd命令无法使用ssh

最近我在远程访问服务器的时候&#xff0c;在winR运行cmd的时候&#xff0c;输入ssh来获得本地和服务器映射&#xff0c;无法实现。提示&#xff1a;’SSH’ 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 下面的方法可以完美解决这个问题&#xff1a; 目…

四大运营商的优缺点,你的选择是对的吗?

随着2022年中国广电获得基础运营商服务牌照&#xff0c;中国从三大运营商变成了四大运营商&#xff1a;中国移动&#xff0c;中国联通&#xff0c;中国电信&#xff0c;中国广电。这四大运营商到底都有什么优缺点呢&#xff1f;大家一直在用的运营商手机卡&#xff0c;大家了解…

REE刷TLB时会把安全的TLB刷掉吗

思考: REE刷TLB时会把安全的TLB刷掉吗? TEE刷TLB时能否刷安全的TLB?例如页表管理着的共享内存,它的翻译缓存到了TLB. 首先,纠正一下用词,这里的"刷",来自某些操作系统中的"flush",在TLB底层的操作指令中,是没有flush或clean的,关于TLB的操作指令…

基于linux下的高并发服务器开发(第一章)- 静态库的使用1.5

1、创建lesson05文件夹&#xff0c;mkdir lesson05,然后创建子文件夹calc和library 在calc文件夹下有文件add.c&#xff0c;div.c&#xff0c;mult.c &#xff0c; sub.c &#xff0c;head.h&#xff0c;main.c在library文件夹下有文件夹include&#xff0c;lib&#xff0c;sr…

目标跟踪基础:数据关联算法

本文来自公众号“AI大道理” —————— 数据关联是多目标跟踪任务中的关键步骤&#xff0c;其目的主要是为了进行帧与帧之间的多个目标的匹配。 1、数据关联 数据关联其实就是一个沿着时间轴&#xff0c;将来自同一个物体的不同时刻的信号串联起来的过程。 数据关联通常在…

探索基于300W-LP的3D人脸关键点检测

目录 前言一、&#xff13;D 关键点可视化二、使用步骤1.300W-LP转为YOLO数据格式2.修改数据入口3.开始训练 总结 前言 300WLP数据集提供来丰富的人脸线索&#xff0c;包括&#xff12;D或&#xff13;D的关键点信息&#xff0c;Head Angle和&#xff13;DMM的参数等&#xff…

【岗位】IT行业岗位知识图谱--大数据工程师、机器学习、嵌入式、架构师

目录 1. 大数据工程师技能图谱2. 机器学习技能图谱3. 架构师技能图谱4. 嵌入式开发必备技能5. 嵌入式体系结构 1. 大数据工程师技能图谱 2. 机器学习技能图谱 3. 架构师技能图谱 4. 嵌入式开发必备技能 5. 嵌入式体系结构 **点赞、关注、评论、收藏哦**

7.7.8clip/简单量化

一、 clip函数&#xff1a;限制一个array的上下界 给定一个范围[min, max]&#xff0c;数组中值不在这个范围内的&#xff0c;会被限定为这个范围的边界。如给定范围[0, 1]&#xff0c;数组中元素值小于0的&#xff0c;值会变为0&#xff0c;数组中元素值大于1的&#xff0c;要…