Java基础篇——注解和反射
注解
注解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基础篇——注解和反射的更多相关文章
- java基础篇---注解(Annotation)
一.概念 Annontation是Java5开始引入的新特征.中文名称一般叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类.方法.成员变量等)进行关 ...
- java基础篇3之反射
1.反射的基础 反射的基石---->Class类 java程序中的各个java类属于同一类事物,描述这类事物的java类名就是Class 获取字节码对应的实例对象(Class类型) class ...
- 小白—职场之Java基础篇
java基础篇 java基础 目录 1.java是一种什么语言,jdk,jre,jvm三者的区别 2.java 1.5之后的三大版本 3.java跨平台及其原理 4.java 语言的特点 5.什么是字 ...
- Java基础篇(JVM)——类加载机制
这是Java基础篇(JVM)的第二篇文章,紧接着上一篇字节码详解,这篇我们来详解Java的类加载机制,也就是如何把字节码代表的类信息加载进入内存中. 我们知道,不管是根据类新建对象,还是直接使用类变量 ...
- java基础篇---I/O技术
java基础篇---I/O技术 对于任何程序设计语言而言,输入输出(I/O)系统都是比较复杂的而且还是比较核心的.在java.io.包中提供了相关的API. java中流的概念划分 流的方向: 输 ...
- 金三银四跳槽季,BAT美团滴滴java面试大纲(带答案版)之一:Java基础篇
Java基础篇: 题记:本系列文章,会尽量模拟面试现场对话情景, 用口语而非书面语 ,采用问答形式来展现.另外每一个问题都附上“延伸”,这部分内容是帮助小伙伴们更深的理解一些底层细节的补充,在面试中可 ...
- java基础篇---HTTP协议
java基础篇---HTTP协议 HTTP协议一直是自己的薄弱点,也没抽太多时间去看这方面的内容,今天兴致来了就在网上搜了下关于http协议,发现有园友写了一篇非常好的博文,博文地址:(http: ...
- java基础篇---I/O技术(三)
接上一篇java基础篇---I/O技术(二) Java对象的序列化和反序列化 什么叫对象的序列化和反序列化 要想完成对象的输入或输出,还必须依靠对象输出流(ObjectOutputStream)和对象 ...
- Java基础篇 - 强引用、弱引用、软引用和虚引用
Java基础篇 - 强引用.弱引用.软引用和虚引用 原创零壹技术栈 最后发布于2018-09-09 08:58:21 阅读数 4936 收藏展开前言Java执行GC判断对象是否存活有两种方式其中一种是 ...
- java基础篇 之 构造器内部的多态行为
java基础篇 之 构造器内部的多态行为 我们来看下下面这段代码: public class Main { public static void main(String[] args) { new ...
随机推荐
- LeetCode------递归(爬楼梯)
1.递归 1.一个问题的解可以分解为几个子问题的解. 2.这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样 3.存在基线/终止条件 来源:力扣(LeetCode) 链接:https:// ...
- C#--String.Substring方法
第一种:String.SubString(int start,int length) 截取指定长度的字符串 这里有两个int型的参数 string表示字符串截取的起始位置,length表截取的 ...
- IP分类与子网划分
1.IP地址的格式 每一类地址都由两个固定长度的字段组成: (1)网络号 net-id:它标志主机(或路由器)所连接到的网络 (2)主机号 host-id:它标志该主机(或路由器). 最大可指派 ...
- beego学习———安装bee
Bee安装 有各种坑,一会儿GOPATH的问题,一会儿局部的问题了 唉,搞了一个小时 很重要的问题!!!!!!!!!!!! beego的bee工具只能强制新建项目在GOPATH/src目录下 虽然在别 ...
- 【深入浅出 Yarn 架构与实现】2-1 Yarn 基础库概述
了解 Yarn 基础库是后面阅读 Yarn 源码的基础,本节对 Yarn 基础库做总体的介绍.并对其中使用的第三方库 Protocol Buffers 和 Avro 是什么.怎么用做简要的介绍. 一. ...
- ssh明文密码小工具:sshpass
Xshell 远程时可以用如下方式进行明文密码免交互登陆: ssh 用户:密码@ip 可换到linux时,就不行了,在某些不适合使用公钥免密的情况下,到底该怎样免交互登陆? 于是我找到了sshpass ...
- MIT6.828学习笔记1
Lab 1: Booting a PC Part 1: PC Bootstrap The PC's Physical Address Space 早期的PC机基于Intel的8088处理器,能够寻址1 ...
- npm 依赖下载报错:主机名/IP与证书的altname不匹配
npm 依赖下载报错:主机名/IP与证书的altname不匹配: //取消ssl验证 npm set strict-ssl false npm config set registry http://r ...
- SocketException 不知道这样的主机(Quartz.;Dns.GetHostEntry;new HttpChannel)问题记录
今天发现自己封装的一个Quartz服务无法启动了,跟踪代码才发现了一个问题是因为数字计算机名称导致的,修改了下计算机名称解决了问题.
- 解决can't compare offset-naive and offset-aware datetimes报错
问题描述 在比较 <class 'datetime.datetime'> 类型时,抛出异常 原因 俩个做比较的,一个具有时区,一个不具有时区 解决 如果可以确认俩个时间都是本地时间可以将时 ...