首页 / JAVA / JavaSE: 反射和注解
JavaSE: 反射和注解
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了JavaSE: 反射和注解,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4747字,纯文字阅读大概需要7分钟。
内容图文
![JavaSE: 反射和注解](/upload/InfoBanner/zyjiaocheng/603/0f2b33ecf3914140a0140b584e16f1ec.jpg)
注解和反射
狂神说Java注解和反射笔记,图片来源课程ppt
1.注解Annotation
1.1 什么是注解
- 不是程序本身,可以对程序作出解释,这一点与注释commment一样
- 可以被其他程序(比如编译器)读取
- @注释名,还可以加一些参数值
- 可以加在package,class,method,field上,相当于增加了额外的辅助信息,可以通过反射机制编程实现对这些元数据的访问
//三个内置注解的例子:
@override //重写的注解
@Deprecated //不鼓励使用
@SuppressWarnings(value = {"unchecked"," deprecation"}) //用来抑制编译时的警告信息,需要添加一个参数
1.2 元注解
作用:负责注解其他注解,java定义了4个标准的元注解类型如下:
- @Target:用于描述注解的使用范围
- @Retention:表示需要在什么级别保存该注解信息,用于描述注解的生命周期 source < class < runtime(默认)
- @Document:表示是否将注解生成在javadoc中
- @Inherited:表示子类可以继承父类中的注解
1.3 自定义注解
使用@interface自定义注解
- 其中的每一个方法实际上是声明了一个配置参数,方法的名称就是参数的名称,返回值类型(只能说基本类型,Class,String,enum)就是参数的类型
- 通过default来声明参数的默认值
- 如果只有一个参数成员,一般为value,使用时可以省略
- 必须要有值
public class MyAnnotation {
@MyAnnotation1(schools = {"清华大学"})
public void test(){}
}
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation1 {
//注解的参数:参数类型+参数名()
String name() default "";
int age() default 0;
int id() default -1;
String [] schools();
}
2.反射机制Reflection
动态语言指运行时代码可以根据某些条件改变自身结构,如JS、python。
Java是静态语言,但有一定的动态性,来自反射机制。
- 优点:实现动态创建对象和编译
- 缺点:对性能有影响。反射基本上是一种解释操作。
2.1 Class类
如何获取Class类的实例:
2.2 类的加载过程
什么时候会发生类的初始化:
类加载器:
- 类加载的作用:将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行数据结构,然后在堆中生成一个代表这个类的java.lang.Class对象,作为方法区种类数据的访问入口。
- 类缓存:标准的JavaSE类加载器可以按要求查找类,但一旦某个类被加载到类加载器中,他将维持(缓存)一段时间。
System.getProperty("java.class.path");
/*
/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/charsets.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/deploy.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/ext/cldrdata.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/ext/dnsns.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/ext/jaccess.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/ext/jfxrt.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/ext/localedata.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/ext/nashorn.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/ext/sunec.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/ext/zipfs.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/javaws.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/jce.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/jfr.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/jfxswt.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/jsse.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/management-agent.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/plugin.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/resources.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/jre/lib/rt.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/lib/ant-javafx.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/lib/dt.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/lib/javafx-mx.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/lib/jconsole.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/lib/packager.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/lib/sa-jdi.jar:
/Library/Java/JavaVirtualMachines/jdk1.8.0_281.jdk/Contents/Home/lib/tools.jar:
/Users/???/Documents/code/Java/out/production/Java:
/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar
*/
2.3 获取运行时类的完整结构
一系列内置方法
3. 用途
3.1 动态创建对象
3.2 调用指定的方法
invoke方法:
setAccessible方法:
3.3 性能分析
普通new方式调用:
反射方式调用:
反射方式调用,关闭检测:
一次运行的结果:
9ms vs 5700ms 1960ms
3.4 反射操作泛型
3.5 反射操作注解
内容总结
以上是互联网集市为您收集整理的JavaSE: 反射和注解全部内容,希望文章能够帮你解决JavaSE: 反射和注解所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。