注解

注解Annotation可以被其他程序(编译器)读取,常见的有@override

内置注解

  • @Override

    适用于修饰方法,表明重写父类中的一个方法

  • @Deprecated

    用于修饰类、方法、属性等,表示由于落后或者存在危险被舍弃,不鼓励使用

  • @SuppressWarnings("")

    用于镇压编译器的警告,可以有很多参数选择“all”"unchecked""value={"unchecked","deprecation"}"

元注解

用于解释其他注解的注解

  • @Target()

    @Target(value=ElementType.METHOD)//表明该注解只能用于方法

    带参,用于描述注解的使用范围

  • @Retention

    描述注解的生命周期

    (SOURCE、CLASS、RUNTIME)

  • @Documented

    表示是否将注解生成在JAVAdoc中

  • @Inherited

    表示子类可以继承父类的注解

自定义注解

  • 使用@interface定义

    public @interface 注解名 {
    //参数定义方法:参数类型+参数名();
    int age() default 0;//默认值为0
    }
    //代码块中的方法即是注解的参数
    //可以通过default来声明参数的默认值
    //注解元素必须要有值

反射

反射Reflection的出现使Java成为了准动态语言,利用反射机制,可以使原本静态的Java语言获得类似动态语言的特性,取得任何类的内部信息,包括private修饰的属性

  • 获取反射对象

    Class 对象名  = 类的class属性;
    Class 对象名 = Class.forName("类路径");
    Class 对象名 = 类实例对象.getClass();
  • 有Class对象的类型

    [所有的类、接口、数组、枚举、注解、基本数据类型、void]

  • 不会引发类初始化的情况

    • 子类引用父类静态变量
    • 通过数组定义引用类
    • 引用类的常量属性
  • 类的加载机制

  • 获取类的运行时结构

            ReflectionTest test = new ReflectionTest();//创建类实例
    //反射获取类对象
    //Class myclass =Class.forName("practice11.ReflectionTest");
    Class myclass =test.getClass();
    //获取类名
    System.out.println(myclass.getName());
    System.out.println(myclass.getSimpleName());
    //获取属性
    Field[] fields1 = myclass.getFields();//获取public属性
    Field[] fields2 = myclass.getDeclaredFields();//获取所有属性
    //获取方法
    Method[] methods1 = myclass.getMethods();//获取该类及其父类的所有public方法
    Method[] methods2 = myclass.getDeclaredMethods();//获取本类的所有方法
  • 动态创建对象

        Class myRft = Class.forName("practice11.ReflectionTest");
    //使用反射对象的newInstance方法实例化对象/
    ReflectionTest test1 =(ReflectionTest) myRft.newInstance();//调用无参构造
    System.out.println(test1.toString());
    //使用构造器实例化对象
    Constructor constructor = myRft.getConstructor(String.class, int.class);
    ReflectionTest test2 =(ReflectionTest) constructor.newInstance("祖国万岁",72);//调用有参构造
    //通过反射调用方法
    Method name = myRft.getDeclaredMethod("setName", String.class);//获取方法
    name.invoke(test2,"中国万岁");//调用方法
    //通过反射修改属性
    Field age = myRft.getDeclaredField("age");
    age.setAccessible(true);//关闭权限检测(可以修改私有属性)
    age.set(test2,70);
  • 通过反射获得注解

            //获得类层的所有注解
    Annotation[] annotations = Student.class.getAnnotations();
    //获得属性的注解
    Field[] fields = Student.class.getFields();
    for (Field field : fields) {
    MyField fieldAnnotations = field.getAnnotation(MyField.class);
    System.out.println(fieldAnnotations);
    }

Java基础篇——注解和反射的更多相关文章

  1. java基础篇---注解(Annotation)

    一.概念 Annontation是Java5开始引入的新特征.中文名称一般叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类.方法.成员变量等)进行关 ...

  2. java基础篇3之反射

    1.反射的基础 反射的基石---->Class类 java程序中的各个java类属于同一类事物,描述这类事物的java类名就是Class 获取字节码对应的实例对象(Class类型) class ...

  3. 小白—职场之Java基础篇

    java基础篇 java基础 目录 1.java是一种什么语言,jdk,jre,jvm三者的区别 2.java 1.5之后的三大版本 3.java跨平台及其原理 4.java 语言的特点 5.什么是字 ...

  4. Java基础篇(JVM)——类加载机制

    这是Java基础篇(JVM)的第二篇文章,紧接着上一篇字节码详解,这篇我们来详解Java的类加载机制,也就是如何把字节码代表的类信息加载进入内存中. 我们知道,不管是根据类新建对象,还是直接使用类变量 ...

  5. java基础篇---I/O技术

    java基础篇---I/O技术   对于任何程序设计语言而言,输入输出(I/O)系统都是比较复杂的而且还是比较核心的.在java.io.包中提供了相关的API. java中流的概念划分 流的方向: 输 ...

  6. 金三银四跳槽季,BAT美团滴滴java面试大纲(带答案版)之一:Java基础篇

    Java基础篇: 题记:本系列文章,会尽量模拟面试现场对话情景, 用口语而非书面语 ,采用问答形式来展现.另外每一个问题都附上“延伸”,这部分内容是帮助小伙伴们更深的理解一些底层细节的补充,在面试中可 ...

  7. java基础篇---HTTP协议

    java基础篇---HTTP协议   HTTP协议一直是自己的薄弱点,也没抽太多时间去看这方面的内容,今天兴致来了就在网上搜了下关于http协议,发现有园友写了一篇非常好的博文,博文地址:(http: ...

  8. java基础篇---I/O技术(三)

    接上一篇java基础篇---I/O技术(二) Java对象的序列化和反序列化 什么叫对象的序列化和反序列化 要想完成对象的输入或输出,还必须依靠对象输出流(ObjectOutputStream)和对象 ...

  9. Java基础篇 - 强引用、弱引用、软引用和虚引用

    Java基础篇 - 强引用.弱引用.软引用和虚引用 原创零壹技术栈 最后发布于2018-09-09 08:58:21 阅读数 4936 收藏展开前言Java执行GC判断对象是否存活有两种方式其中一种是 ...

  10. java基础篇 之 构造器内部的多态行为

    java基础篇 之 构造器内部的多态行为 ​ 我们来看下下面这段代码: public class Main { public static void main(String[] args) { new ...

随机推荐

  1. Nginx通用优化示例

    user nginx; worker_processes auto; #worket_cpu_affinity auto; error_log /var/log/nginx/error.log war ...

  2. 在电脑主机(MainFrame)中只需要按下主机的开机按钮(on()),即可调用其它硬件设备和软件的启动方法,如内存(Memory)的自检(check())、CPU的运行(run())、硬盘(Hard

    欢迎大家加入我的社区:http://t.csdn.cn/Q52km 社区中不定时发红包 文章目录 1.UML类图 2.源码 3.优缺点 1.UML类图 2.源码 package com.zheng; ...

  3. 经典排序算法之-----选择排序(Java实现)

    其他的经典排序算法链接地址:https://blog.csdn.net/weixin_43304253/article/details/121209905 选择排序思想: 思路: 1.从整个数据中挑选 ...

  4. 齐博x1注意事项:再强调严禁用记事本改任何文件

    提醒大家,X1任何文件,不要用记事本修改.比如这个用户就改出问题了 导致后台不能升级. 当然这是问题之一, 还有其它意料之外的问题.还没发现. 这个用户做一个测试风格. 配置文件可能是用记事本修改的. ...

  5. 累加和为 K 的子数组问题

    累加和为 K 的子数组问题 作者:Grey 原文地址: 博客园:累加和为 K 的子数组问题 CSDN:累加和为 K 的子数组问题 题目说明 数组全为正数,且每个数各不相同,求累加和为K的子数组组合有哪 ...

  6. 我终于会写 Java 的定时任务了!

    前言 学过定时任务,但是我忘了,忘得一干二净,害怕,一直听别人说: 你写一个定时任务就好了. 写个定时任务让他去爬取就行了. 我不会,所以现在得补回来了,欠下的终究要还的,/(ㄒoㄒ)/~~ 定时任务 ...

  7. AIR32F103(三) Linux环境基于标准外设库的项目模板

    目录 AIR32F103(一) 合宙AIR32F103CBT6开发板上手报告 AIR32F103(二) Linux环境和LibOpenCM3项目模板 AIR32F103(三) Linux环境基于标准外 ...

  8. 五、Python操作redis

    五.Python操作redis 一.python对redis基本操作 (1)连接redis # 方式1 import redis r = redis.Redis(host='127.0.0.1', p ...

  9. Seata Server 1.5.2 源码学习

    Seata 包括 Server端和Client端.Seata中有三种角色:TC.TM.RM,其中,Server端就是TC,TM和RM属Client端.Client端的源码学习上一篇已讲过,详见 < ...

  10. MySQL 是怎么加行级锁的?为什么一会是 next-key 锁,一会是间隙锁,一会又是记录锁?

    大家好,我是小林. 是不是很多人都对 MySQL 加行级锁的规则搞的迷迷糊糊,一会是 next-key 锁,一会是间隙锁,一会又是记录锁. 坦白说,确实还挺复杂的,但是好在我找点了点规律,也知道如何如 ...