1.注解annotation:可以被编译器读取
2.从Java1.5开始引入。
3。Java内置注解:
- @Deprecated 已过期,表示方法是不被建议使用的
- @Override 重写,标识覆盖它的父类的方法
- @SuppressWarnings 压制警告,抑制警告(需要加参数)
4.Java除了内置了三种标准注解,还有四种元注解。
@Target 表示该注解用于什么地方,可能的值在枚举类 ElemenetType 中,包括:
ElemenetType.CONSTRUCTOR-----------------------------构造器声明
ElemenetType.FIELD ----------------------------------域声明(包括 enum 实例)
ElemenetType.LOCAL_VARIABLE------------------------- 局部变量声明
ElemenetType.METHOD ---------------------------------方法声明
ElemenetType.PACKAGE --------------------------------包声明
ElemenetType.PARAMETER ------------------------------参数声明
ElemenetType.TYPE----------------------------------- 类,接口(包括注解类型)或enum声明
@Retention 表示在什么级别保存该注解信息。可选的参数值在枚举类型 RetentionPolicy 中,包括:
RetentionPolicy.SOURCE-------------注解将被编译器丢弃
RetentionPolicy.CLASS -------------注解在class文件中可用,但会被VM丢弃
RetentionPolicy.RUNTIME ---------VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息。
@Documented 将此注解包含在 javadoc 中 ,它代表着此注解会被javadoc工具提取成文档。在doc文档中的内容会因为此注解的信息内容不同而不同。相当与@see,@param 等。
@Inherited 允许子类继承父类中的注解。
5.元注解实例
6.自定义注解 以及注解参数
7.
- 动态语言(弱类型语言)是运行时才确定数据类型的语言,变量在使用之前无需申明类型,通常变量的值是被赋值的那个值的类型。比如Php、Asp、JavaScript、Python、Perl等等。
var s ="hello";
var i = 0;
var b = true;
- 静态语言(强类型语言)是编译时变量的数据类型就可以确定的语言,大多数静态语言要求在使用变量之前必须生命数据类型。比如Java、C、C++、C#等。
8。Java也有var为什么Java还是强类型语言呢?
var不是关键字,它相当于是一种动态类型;
var动态类型是编译器根据变量所赋的值来推断类型;
var 没有改变Java的本质,var只是一种简便的写法,
就是说在定义局部变量时,任意什么类型都可以用var定义变量的类型会根据所赋的值来判断。
9。用var声明变量的注意事项:
1,var只能在方法内定义变量,不允许定义类的成员变量。
2,var 定义变量必须赋初始值,------》以后不能在赋初始值。
3,var每次只能定义一个变量,不能复合声明变量。
10.反射:在jvm加载完类之后,会为每一个类生成一个class对象,这个class对象包含了完整的结构信息,可以通过class对象得出类的结构。
相当于 镜子。
11.
12.
13.反射后可以得到的信息:
某个类的属性、方法、构造器,实现了哪些接口,
14.
15.
16.
他们的class对象是什么
17.反射的API
constructor.newInstance(); /** * 获取方法 * */ //获取___类中所有的public修饰的方法,其中包括父类的方法。 //如果还要获取所有的方法用getDeclaredMethods()方法 Method[] methods = rName.getMethods(); //获取___指定的方法,这获取的是无参方法, //要获取有参的请在行参列表上写上(指定的方法名,数据类型1.class,数据类型2.class); Method method = rName.getMethod(方法名); //调用___非static修饰的方法需要invoke(对象,实参1,实参2), //有static修饰的方法需要invoke(null,实参1,实参2)。 //我这调用的非static修饰方法没有参数就只需一个对象 method.invoke(newInstance); /** * 获取字段 * */ //获取___类中的public字段。如果还要获取所有的字段用getDeclaredFields()方法 Field[] fields = rName.getFields(); //获取___指定的字段。 Field field = rName.getDeclaredField(指定的字段名); //设置___指定的字段,非static修饰,set(对象,值);有static修饰,set(null,值) field.set(newInstance,5.2); //调用___指定字段的值,非static修饰,get(对象);有static修饰,get(null) Object object = field.get(newInstance); System.out.println("指定字段的值=="+object); /** * 破坏包装declaredField.setAccessible(boolean)破坏封装,可以调用私有成员 * true:破环 * false:默认值,不破坏 */ Field field2 = rName.getDeclaredField(私有化的字段名); //破坏封装,不让字段私有化 field2.setAccessible(true); //设置字段的值 field2.set(newInstance,值); //调用设置后的字段值,并打印 Object object2 = field2.get(newInstance); System.out.println("破坏封装==="+object2); //获取全限定类名 String name = rName.getName(); System.out.println("全限定类名: "+name); //获取类名简写 String simpleName = rName.getSimpleName(); System.out.println("类名简写: "+simpleName);
18.在这个实例下 输出两个hashCode值相等
19.根据class对象新建一个对象(无参构造器)
新建一个有参构造器生成一个对象
通过反射 得到方法method 然后使用invoke进行传参
通过反射得到属性 然后进行赋值。要记得打开可达性
19.通过反射获得注解的信息(包括注解的value值等)