studyNote_java基础_Day22
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了studyNote_java基础_Day22,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4992字,纯文字阅读大概需要8分钟。
内容图文
![studyNote_java基础_Day22](/upload/InfoBanner/zyjiaocheng/745/f1ad69bf8406419096d15ae0af35a642.jpg)
内省+注解+泛化相关
内省:就是自查的意思,本质就是反射,利用反射自省类中的属性和方法
自省的实现方式:
方式一:
jdk(jre)中自带的一套自省的类库,类库中包含的api方法
侧重:属性和属性的值以及属性所对应的getter和setter方法
方式二:
apache基金会提供的一套公共的自省类库,Commons-Beans.jar
注解:将来的发展趋势
用注解可以替换xml配置和属性文件的配置
用注解开发代码效率很高
注解实际上就是一个标识,注解所代表的功能是用反射代码实现的
这段反射代码用于解析注解(找到并确定注解的存在),
根据注解设定的属性来决定做什么样的功能
使用注解的步骤
1.如何定义注解(创建注解)
右键单击创建Annotation
//代表此注解可以修饰的目标,类,方法上
@Target({ElementType.TYPE,ElementType.METHOD})
//此注解保留策略,在运行期间能够使用
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnontation {
//在注解中可以放置注解的属性
public String value();//是属性,不是方法
public String name() default "abc" ;
public String[] colors() default {"red","blue"};
}
源注解/元注解:用于修饰注解的注解,jdk自带的注解
@Target(ElementType.xxx) 把注解应用在什么目标上
@Target({ElementType.xxx,ElementType.xxx1}) 把注解应用在什么目标上
@Retention(RetentionPolicy.RUNTIME) 注解的保留策略
被他修饰的注解保留区域
编译器 类加载 jvm
.java -->.class-->加载-->运行
SOURCE:源码级别,给编译器看的,编译完成后直接丢弃该种注解,
生成的.class文件没有该类型的注解
CLASS:给类加载器看的,在类加载的时候进行的一系列引导操作
编译器编译后存在,类加载器完成加载之后,丢弃该保留区域的注解
RUNTIME:给jvm看的,在程雪运行过程中做相关的操作
类加载器加载后保留,在jvm运行时通过反射技术反射出使用的是什么注解
,注解的属性值是什么,根据他们两个的值做对应的操作
@Documented:自定义的注解,如果使用Documented注解生成的doc文档上,使用该自定义注解的地方会显示注解信息,如果去掉@Ducumented,生成的doc文档将不再有注解信息
注解中的属性详解:
a.注解定义属性和接口中定义方法类似,缺省默认public
public 类型 属性名称();
b.定义属性时,如果没有使用default指定默认值
使用当前注解必须为该属性赋值
(可以利用该特点,设置必须赋值的属性不要使用default指定默认值)
使用default指定默认之后,该属性在注解使用时可以赋值
也可以不赋值
c.注解中的属性类型是有要求的
可以是八种基本数据类型,可以是枚举类型,Class类型,String类型等
以上类型的"一维"数组,如String[] likes() default {};
使用注解时,如果数组类型的属性的值是一个值的话
赋值时可以吧"{}"省略掉,@Anoo1(name="zs",likes="fb")
d.
2.把注解应用在对应的目标上 (把注解放在什么地方)
在对应的目标写
@注解的名称(属性名=属性值)
@注解的名称(属性名1=属性值1,属性名2=属性值2,....属性名n=属性值n)
3.通过反射的api解析注解 (有注解标识就做对应的功能)
参见项目代码
总结:用注解就是根据注解和注解上的属性值,来决定是否做一些事
可以是指行指定的功能,也可以是调用一个具体方法
注解:1.自定义注解 2.应用注解 3.解析注解
泛型:一种参数化的类型
//非泛型,不是参数化类型
ArrayList list=new ArrayList();
list.add("abc");
list.add(10);
//泛型版本 标准做法 参数化类型 String类型
ArrayList<String> list1=new ArrayList<String>();
list1.add("abc");
list1.add("bcd");
//泛型,不推荐
ArrayList list2=new ArrayList<String>();
list2.add("abc");
list2.add(10);
new Demo01().xxx(list1);
new Demo01().xxx(list2);
//泛型,不推荐
ArrayList<String> list3=new Demo01().yyy();
list3.add("abc");
//错误做法,编译报错
//两边的泛型必须一致
//ArrayList<Object> list4=new ArrayList<String>();
自定义泛型:
-类上的泛型,泛型类
泛型一定要先定义后使用,在类的名字后面定义
泛型的类型一定要是引用数据类型,不能是基本数据类型
不能对确切的反省类型使用instanceof关键字
比如:
//此种写法语法报错
if(num instanceof Generic<Number>){
}
定义在类上,在类的内部起作用,在整个类范围的内类型一致
类上的泛型的具体类型要在创建类的对象的时候指定泛型的具体类型
如果在使用类上的泛型时不指定泛型的具体类型,
默认的具体类型为泛型的上边界
-方法上的泛型,泛型方法
泛型要先定义后使用,在返回值之前定义,通常是用一个大写字母来定义一个泛型
可以定义多个,且定义在方法上,在方法内部起作用
方法上的泛型在方法被调用的时候自动推断出具体的泛型
无论何时,尽量使用泛型方法,方法泛型的作用域小,只局限于本方法内
比如:
public<T> T save(T t){
return t;
}
<T>就是标志此方法是一个泛型方法,放在修饰符和返回类型之间
可以放置多个符号,<T,E>,说明有两个类型需要参数化确定
泛型的上边界:
泛型所取得类型是上边界或者上边界类型的子孙类型,如果不指定泛型默认上边界是Object
泛型擦除:
泛型在编译期间起作用,真正执行期间泛型已经被擦除了
在编译阶段,编译器会将所有使用泛型的地方替换为该泛型的上边界
并在必要的时候增加上必须的类型强制转换和类型检查
在执行期间没有泛型的概念了
泛型在编译期间就被擦除掉了
此过程叫做泛型擦除
内容总结
以上是互联网集市为您收集整理的studyNote_java基础_Day22全部内容,希望文章能够帮你解决studyNote_java基础_Day22所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。