注解和反射

news2025/7/22 5:28:34

注解和反射

  • 注解
  • 元注解
  • 反射

注解

注解和注释的区别

注解 annotation写在程序之中,程序可以识别,做出相应的动作处理,具有检查和约束程序的作用

注释 comment 写在程序之中,供人参考,提示使用,程序会自动忽略

注解在JDK5开始引入

常见注解

@Override 重写一个方法

@Deprecated 不推荐使用

@SuppressWarnings("all") 镇压警告

元注解

元注解就是可以负责注解其他的注解

@Target 描述注解的使用范围

@Retention 表示在什么级别保存该注解信息(Source < Class < Runtime)

@Document 该注解被包含在javadoc

@Inherited 说明子类可以继承父类中的注解

自定义注解

@MyAnnotation("value")
public class User {
    @MyAnnotation(name = "mao", age = 18, id = 1, university = "西安科技大学", value = "")
    public static void main(String[] args) {
    }
}

@Target(value = {ElementType.METHOD,ElementType.TYPE})
@Retention(value = RetentionPolicy.RUNTIME)
@Documented
@Inherited
@interface MyAnnotation{
    String name() default "coffeemao";
    int age() default 0;
    // -1 代表不存在
    int id() default -1;

    String[] university() default {"清华大学","北京大学"};
    
    String value();
}

反射

反射 reflection,一个类在内存中只存在一个class对象,一个类被加载之后,类的整个结构都会封装在Class对象中

public class ReflectionDemo {
    public static void main(String[] args) throws ClassNotFoundException {
        Class<?> aClass = Class.forName("com.mao.pojo.User");
        Class<?> bClass = Class.forName("com.mao.pojo.User");
        Class<?> cClass = Class.forName("com.mao.pojo.User");

        System.out.println(aClass.hashCode());
        System.out.println(bClass.hashCode());
        System.out.println(cClass.hashCode());
    }
}

class User{
    private String username;
    private String password;
}

获取class对象

    public static void main(String[] args) throws ClassNotFoundException {
        User user = new User();
        System.out.println(user);

        // 对象获取
        Class aClass = user.getClass();
        System.out.println(aClass.hashCode());

        // forName 获取
        Class bClass = Class.forName("com.mao.pojo.User");
        System.out.println(bClass.hashCode());

        // 类.class
        Class<User> cClass = User.class;
        System.out.println(cClass.hashCode());

        // 基本数据类型的包装类获得
        Class<Integer> type = Integer.TYPE;
        System.out.println(type);

        System.out.println(type.getSuperclass());
        System.out.println(aClass.getSuperclass());
    }

所有类型的Class对象

    public static void main(String[] args) throws ClassNotFoundException {
        System.out.println(Object.class);
        System.out.println(Comparable.class);
        System.out.println(String[].class);
        System.out.println(int[][].class);
        System.out.println(Override.class);
        System.out.println(Integer.class);
        System.out.println(void.class);
        System.out.println(Class.class);
        System.out.println(new int[10].getClass().hashCode());
        System.out.println(new int[100].getClass().hashCode());
    }

结果是

class java.lang.Object
interface java.lang.Comparable
class [Ljava.lang.String;
class [[I
interface java.lang.Override
class java.lang.Integer
void
class java.lang.Class
750044075
750044075

查看类加载器

    public static void main(String[] args) throws ClassNotFoundException {
        ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
        System.out.println(systemClassLoader);

        ClassLoader parent = systemClassLoader.getParent();
        System.out.println(parent);

        ClassLoader parent1 = parent.getParent();
        System.out.println(parent1);

        ClassLoader classLoader = Class.forName("java.lang.Object").getClassLoader();
        System.out.println(classLoader);
    }

jdk.internal.loader.ClassLoaders A p p C l a s s L o a d e r @ 2437 c 6 d c j d k . i n t e r n a l . l o a d e r . C l a s s L o a d e r s AppClassLoader@2437c6dc jdk.internal.loader.ClassLoaders AppClassLoader@2437c6dcjdk.internal.loader.ClassLoadersPlatformClassLoader@2cb4c3ab
null
null

在这里插入图片描述
获取java运行放入环境在这里插入图片描述

获取类运行时的结构

public class ReflectionDemo {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
        Class className = Class.forName("com.mao.pojo.User");
        System.out.println(className.getClass());
        System.out.println(className.getSimpleName());
        System.out.println("=============================");
        User user = new User();
        className = user.getClass();
        System.out.println(className.getClass());
        System.out.println(className.getSimpleName());
        System.out.println(className.getField("username"));
        System.out.println(className.getField("password"));
    }
}

class User{
    public String username;
    private String password;

}

在这里插入图片描述
获取构造器

        Class className = Class.forName("com.mao.pojo.User");
        Constructor[] constructors = className.getConstructors();
        for (Constructor constructor : constructors) {
            System.out.println(constructor);
        }
        constructors = className.getDeclaredConstructors();
        for (Constructor constructor : constructors) {
            System.out.println(constructor);
        }

在这里插入图片描述
通过构造器创建对象

        Class classObject = Class.forName("com.mao.pojo.User");
        //  newInstance() 需要无参构造器,且防蚊权限足够
        User user = (User) classObject.newInstance();
        System.out.println(user);

        Constructor constructor = classObject.getDeclaredConstructor(String.class,String.class);
        User root = (User)constructor.newInstance("root", "123456");
        System.out.println(root);

在这里插入图片描述

反射获取到类对象,创建实例,获取到方法的set方法,通过invoke激活,对对对象设置值

public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InstantiationException, InvocationTargetException {
        Class classObject = Class.forName("com.mao.pojo.User");
        User user = (User) classObject.newInstance();
        Method setUsername = classObject.getDeclaredMethod("setUsername", String.class);
        setUsername.invoke(user,"root");
        System.out.println(user.getUsername());
    }

反射将私有属性进行访问

        Class classObject = Class.forName("com.mao.pojo.User");
        User user = (User) classObject.newInstance();
        Field username = classObject.getDeclaredField("username");
        // 破解 private,取消安全检测
        username.setAccessible(true);

        username.set(user,"admin");
        System.out.println(user.getUsername());

在这里插入图片描述

对比正常使用创建对象,反射创建对象,设置可见性的方式对比性能,结果发现new方式创建对象的方式最快,反射创建对象的时间最长,关闭检查,性能可提高一倍

public class ReflectionDemo {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException, NoSuchMethodException, InstantiationException, InvocationTargetException {
        // 普通方式
        User user = new User();
        long start = System.currentTimeMillis();
        for (int i = 0; i < 1000000000; i++) {
            user.getUsername();
        }
        long end = System.currentTimeMillis();
        System.out.println(end - start);

        // 反射获取方法
        Class aClass = Class.forName("com.mao.pojo.User");
        Method getUsername = aClass.getDeclaredMethod("getUsername", null);

        long start1 = System.currentTimeMillis();
        for (int i = 0; i < 1000000000; i++) {
            getUsername.invoke(user,null);
        }
        long end1 = System.currentTimeMillis();
        System.out.println(end1 - start1);


        // 反射获取方法,关闭检查
        Class bClass = Class.forName("com.mao.pojo.User");
        Method getUsername1 = bClass.getDeclaredMethod("getUsername", null);
        getUsername1.setAccessible(true);

        long start2 = System.currentTimeMillis();
        for (int i = 0; i < 1000000000; i++) {
            getUsername1.invoke(user,null);
        }
        long end2 = System.currentTimeMillis();
        System.out.println(end2 - start2);
    }
}
@Data
@AllArgsConstructor
@NoArgsConstructor
class User{
    private String username;
    private String password;

}

在这里插入图片描述

注解级别

@Table("Anno类")
public class Anno {
    @Feild("用户名")
    private String username;
    @Method("main函数")
    public static void main(String[] args) {}
}

@Target(value = ElementType.TYPE)
@Retention(value = RetentionPolicy.RUNTIME)
@interface Table{
    String value();
}

@Target(value = ElementType.FIELD)
@Retention(value = RetentionPolicy.RUNTIME)
@interface Feild{
    String value();
}

@Target(value = ElementType.METHOD)
@Retention(value = RetentionPolicy.RUNTIME)
@interface Method{
    String value();
}

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

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

相关文章

云原生系统学习[Kubernetes]——02 Pod、Deployment、Service

云原生系统学习[Kubernetes]——02 Pod、Deployment、Service [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t9RomXCf-1668486830453)(./assets/image-20221103113345300.png)] 参考资料 什么是YAMLk8s官网文档k8s中文社区k8s-book 学多少&#…

Java:继承和多态

文章目录前言一、继承1.继承概念1.1 继承的语法1.2 父类成员方法1.2.1 子类访问父类的成员变量1.2.2 子类访问父类的成员方法1.3 super、this 关键字1.4 子类构造方法1.5 继承的方式1.6 final 关键字1.7 继承与组合二、多态2.1 多态的概念2.2 多态实现的条件2.3 对重写的认识2.…

Canvas 基础使用

一、基本的画布功能 创建 <canvas>元素时至少要设置 width 和 height 属性&#xff0c;这样才能告诉浏览器在多大面积上绘图。出现在标签包裹里的内容会在浏览器不支持 <canvas>元素时显示。比如&#xff1a; <canvas id"drawing" width"200&q…

PumpkinBook Reading(一)

绪论 基本术语 “算法”是指从数据中学得“模型”的具体方法&#xff0c;“算法”产出的结果称为“模型”&#xff0c;通常是具体的函数或者可抽象地看作为函数。 样本&#xff1a;也称为“示例”&#xff0c;是关于一个事件或对象的描述。因为要想让计算机能对现实生活中的事…

【Python开发】Flask开发实战:个人博客(三)

Flask开发实战&#xff1a;个人博客&#xff08;三&#xff09;在【Python开发】Flask开发实战&#xff1a;个人博客&#xff08;一&#xff09; 中&#xff0c;我们已经完成了 数据库设计、数据准备、模板架构、表单设计、视图函数设计、电子邮件支持 等总体设计的内容。 在【…

公众号裂变拉新,以婴儿辅食为诱饵,实现低成本获客!

大家好~我是娜娜 今天来给大家拆解一个关于食品行业精选公众号增长案例&#xff0c;通过公众号裂变拉新&#xff0c;任务拉新人数5000&#xff0c;留存率达到85%&#xff0c;活动裂变率达到1100.86%。活动数据也还在持续的上升当中。 该公众号的目标人群是新手爸妈&#xff0…

【Java】SpringBoot应用简单示例

SpringBoot应用简单示例SpringBoot应用简单示例HelloWorld搭建项目ResponseBody的作用ComponentScan排除扫描beanSpringBoot集成日志SpringBoot日志初始化原理消息转换器拦截器过滤器操作数据库Spring Data JpaDruid数据源Mybatis-Plus事务处理操作缓存AOP相关概念栗子定时任务…

C语言解析JSON源码

它与 XML 的地位差不多&#xff0c;但就笔者而言&#xff0c;笔者更喜欢 JSON 的风格&#xff0c;因为它更符合我们的思维习惯&#xff0c;同样一份数据&#xff0c;JSON 格式的就是比 XML 要清晰明了一些。 最近笔者需要在 C语言 上解析 JSON 格式&#xff0c;在网上一顿找&am…

XC5VLX30T-2FF323I Virtex-5 LXT FPGA IC 产品参数

概述 Virtex-5 FPGA有-3&#xff0c;-2&#xff0c;-1速度等级&#xff0c;其中-3具有最高的性能。Virtex-5 FPGA直流和交流特性指定为商业和工业级别。除工作温度范围外&#xff0c;除非另有说明&#xff0c;所有直流和交流电气参数对于特定转速等级是相同的(即-1转速等级的工…

一夜登顶GitHub!字节内网数据结构与算法刷题笔记,看完直呼卧槽

网络上流传着一句段子“程序员两条腿&#xff0c;一条是算法&#xff0c;一条是英文&#xff0c;想跑的更远&#xff0c;这两条腿都不能弱”。英文&#xff0c;我们暂且不谈&#xff0c;我们先来谈谈算法。 算法之难&#xff0c;在于将精巧的逻辑&#xff0c;通过合适的数据结…

2 分钟,教你用 Serverless 每天给女朋友自动发土味情话

作者&#xff1a;安可 Serverless 简介 Serverless&#xff0c;中文意思是 “无服务器”&#xff0c;所谓的无服务器并非是说不需要依靠服务器等资源&#xff0c;而是说开发者再也不用过多考虑服务器的问题&#xff0c;可以更专注在产品代码上&#xff0c;同时计算资源也开始…

如何根据自己的SCI论文,匹配适合的期刊? - 易智编译EaseEditing

如何选择合适的目标期刊是需要慎重对待的问题&#xff0c;它决定了你论文的发表速度和被认可度。 可以遵循以下几个步骤来考虑&#xff1a; 1、从你论文的参考文献中选择合适的期刊&#xff08;如果引用文献较少&#xff0c;也可以从引文的参考文献中进行筛选&#xff09;&…

成功解决:ModuleNotFoundError: No module named ‘amp_C‘

在使用transformers时&#xff0c;在调用Trainer的时候遇到了这个问题&#xff0c;原因是apex包有问题&#xff0c; 这里有解决apex安装包的多一些教程 https://blog.csdn.net/Xidian185/article/details/122745427 https://blog.csdn.net/weixin_45225975/article/details/119…

倍福TwinCAT3中使用久同伺服

目录 一、测试设备说明 二、伺服通电和参数设置 1、恢复出厂参数设置 2、恢复出厂&#xff0c;重启后 3、伺服自己点动操作 4、增益、刚度调整 5、伺服零位设定 6、伺服转动一圈编码器脉冲量设定 7、参数保存 三、伺服操作面板 四、TwinCAT3工程配置 1、XML文件 2、…

【元宇宙欧米说】打造艺术与技术构建的交互式数字旅程

Web3 to Earn项目如何扩大应用功能和场景&#xff1f;在Web3时代怎么才能以更新颖、有趣的方式追赶潮流&#xff1f;各Web3领域项目及应用如何进行功能外延以满足用户需求&#xff1f; 11月17日晚上九点&#xff0c;ZenCats项目管理员Fred将以“打造艺术与技术构建的交互式数字…

编码格式转换方法

今天项目上遇到了需要将 SJIS(Shift-JIS) 格式与 UTF8 格式相互转换问题。 首先看一个编码格式问题引发的乱码现象&#xff0c;新建下面的文本文档&#xff0c;然后更名为 test.bat。 echo off echo test chinese character view 测试中文字符显示 pause双击运行 用 chcp 查…

正版授权| iObit Uninstaller 12 Pro 专业卸载器工具

前言 专业的Win系统卸载程序&#xff0c;它可以轻松删除不需要的程序&#xff0c;插件和Windows应用程序&#xff0c;还可以对电脑旧的应用一键更新。安装监视器会检测并记录安装中的所有系统更改&#xff0c;以确保在将来彻底卸载时可以还原所有更改。 功能特点 安装监视器 …

1053 Path of Equal Weight

Given a non-empty tree with root R, and with weight Wi​ assigned to each tree node Ti​. The weight of a path from R to L is defined to be the sum of the weights of all the nodes along the path from R to any leaf node L. Now given any weighted tree, you a…

QT获取计算机硬件信息

一、项目介绍 本文介绍利用QProcess获取计算机的CPU、主板、硬盘等电脑相关硬件信息。 windows提供了“wmic”&#xff08;Windows Management Instrumentation&#xff0c;Windows管理工具&#xff09;&#xff0c;提供了从命令行接口和批命令脚本执行系统管理的支持。可以打…

基于多个openEuler物理机执行mugen测试脚本

【原文链接】基于多个openEuler物理机执行mugen测试脚本 mugen脚本中有的脚本执行需要使用多个物理机&#xff0c;针对此场景&#xff0c;这里以需要两个物理机为例&#xff08;用openEuler虚拟机模拟物理机&#xff09; &#xff08;1&#xff09;首先安装两台openEuler虚拟…