00:00
不是现在注解的作用我还没讲呢啊,就是现在就是怎么用。就会定义,你会用就行,现在我讲解的这个注解,我希望在座的各位能够掌握的是,我让你去写一个注解,你能不能写出来,写出来这个注解之后你怎么去用,你会不会去用,各位知道咱们唠嗑唠了半天,我们就说了四个注解。对吧,JDK内置的四个啊,你要知道分别是谁,Over read你得知道。啊,DEP你得知道。对吧,哎,他这个注解你得知道。啊,Re,你知道?啊,12344个注解你也知道,其中前两个是浪包下的,这两个是圆柱解啊圆柱解,然后你要知道的是你另外需要掌握的内容就是怎么自定义注解。
01:09
定义注解之后,这个注解怎么用?多了去了。一共有五个呢,重点掌握这两个就行了,别的我我连提都不提啊,因为用不着没必要。没必要啊,五个呢,圆柱节五个呢。其中有target和retention,这个是要掌握的啊,要掌握的。定义完注解之后要怎么用,要会用。啊,另外我在这说说什么都可以省啊,如果你这个属性名叫value的话,可以省略。但前提是你是value,并且还得怎么着啊,你只有一个这样的属性,你这个value才能省。另外还有数组的形式,我刚才也讲了,这个比较重要的东西,就是我这个属性,这个类型,我都能出现啥类型,我在这给大家解释,可以出现这种类型,Bad in、布林、string class以及枚举类型。
02:08
啊,以及这个每一种类型的数组形式都可以出现,如果是数组形式的话,哎,你就用大括号的方式,数组形式的话,你就用大括号的方式。大括号会用吗?另外数组当中只有一个元素的话,大括号是可以省略的,你看大括号是可以省略的,有的时候可以省略。另外是用I的符号加注解的名字,然后再加个小括号开始,小括号结束,这里边加属性名,属性值逗号,逗号别丢了啊,属性名等于属性值,然后属性名等于属性值。属性名等于属性值,属性名等于属性值,属性名等于属性值中间用逗号隔开。多少个,很简单,不难,用起来也不难啊,我们可以再去深入的研究一下那两个注解,各位啊,就是他get。啊和retention注解行吧,哎,我们可以看一下啊,在这里呢,我们加一个package,那我们就叫做annotation annotation5吧。
03:06
来,那么这块呢,我们去新建一个class,我们叫my annotation。Not。来注解,各位看啊,假如现在这个注解,我只允许假设啊,只允许,只允许,只允许该注解。可以标注类。方法。那我这该怎么写,各位,就是我这个注解可以标注类和方法,别的都不行。怎么写?At加什么T好?有个value是吧,是个数组吧?好,我问value可以。Value可不可以省可以吧。只能标注类和方法是不是好value省略value后边是一个数组,各位哎,那么这个value如果省掉的话,我们这个里边怎么写啊。
04:04
我们这个数组当中的元素是element type呀,这个数组里边的每个元素是element type啊,Element type它是个枚举,所以这块应该是element type点什么。Type。是不是累啊,以及点什么方法method的吧。是不是好,这个大家能看懂吗?就表示我这个注解只能出现在类上以及方法上,别的位置不行。那么我希望,我希望什么呢?希望这个注解可以被反射,那我应该加什么呀,Retention。是不是,哎,那retention的点过去,大家看这个里边是不是有个value value的话可以省它叫reten保策略,那保持性策略等于什么呀,点什么呀。Runtime,好,大家看,这样的话,我们就相当于说我们的这个注解和这个注解用来标注这个注解的,这俩都是原注解。
05:02
各位啊,来我们这儿删一下,删一下啊,圆注解,这是圆柱解,这是圆注解,这个圆注解用来指定我们这个注解可以出现在类上和方法上,而我们这个注解进来说明这个注解它可以被反射机制所读取,就这么简单,不难。不难啊,可以被反射到。啊,可以被反射到。你看。是吧,那我们可以测试一下呀。可以测试一下,测试一下啊。在这呢,我们写上一个class,我们叫my an test,这个叫MY叫my test,这是一个类啊测试类,我这个地方呢,我加一个什么呀,我就加一个in类性I,我就在上面,我用一下谁,我的MY行不行。能不能用,让不让用,你看报错了,他为什么会报错,鼠标停到这,你看报什么错,你看他说is不能够应用在上上面不行,那如果说你想用在field上,你可以加一个叫element type,然后element type点什么呀,Field。
06:15
那你加上这个之后,你看这就没错了,你看就没错了。那如果说你这个位置没有加这个东西。你看这不就报错了吗?不允许不能出现在这儿,那这个注解能不能出现类上面呢?没毛病,能不能出现在方法上呢?没毛病啊,那出现在方法的局部变量上,出现在这行不行呢?不行。不行,不能出现在这里。不能用在local variable本剧本地的局部变量上,不行不行。对吧,哎,这个地方不行,这个地方也不行,对吧,这地方可以,那能用在构造方法上吗?My annotation。
07:13
这是无参数的构造方法,我们上面直接加上它行不行,不行,不允许出现在constructor,你看。他说不能够应用在上面不行,用不了。那你为什么你的注解只能使用在方法上以及类上面呢?这是因为你这个注解上有一个注解叫。他盖的修饰的这个注解只能出现在我们方法上,以及我们的类型上面。那么再往下呢,就是这个注解是否可以被反射机制所读到,如果你写的是S。那它的意思是什么意思?就表示这个注解只保留在Java原文件当中。编译之后生成class文件,里边就没有它了。啊,如果你这个位置写的是class,那就表示这个注解它可以被保留到class自解码文件当中,如果你这个位置写的是runtime,那么就表示你这个注解它不仅是保留在class文件当中,同时又可以被反射机制所读到,想被反射机制读到。
08:17
啊,能够能够读到啊,就这意思。啊。这个大家理解吗?那有老师我们反射反射应该怎么读啊,来,我在这给大家演示一下啊,难难点啊,反射noation。我们用一个反射机制,现在你这个注解叫myno吗?MY呢?这个注解上面有这样一个runtime,这说明这个注解可以被反射。那你这个注解现在出现这个类上面吗?你想拿这个类上面这个这个这个这个注解是吧,你怎么拿来,我们可以看一下啊。
09:05
可以看一下。那么在这个闷方法当中呢,我们要获取这个上面的这个类,上面的这个注解,我们得先把类拿到明白吧,所以我们先获取类。获取这个类class class.for name,那么这个地方的这个类名是谁,各位。这个。嗯。Copy一下。是不是,哎,拿过来放到这儿。那么拿到这个类之后。拿到这个类之后呢,接下来我们可以看类上面有没有这个这个这个这个叫什么,这个这个注解。判断啊类上面是否有。这个注解。
10:01
是否有它啊,怎么判断呢?哎,c.is annotation present这个方法名比较长啊,就说你这个类上面啊,是否有什么呀,Annotation,哪个annotation啊,哎,就是。My an这个类my annotation啊,点什么class。来我们看看输出一下。我们看这个结果啊。运行。对吧,判断这个类型上是否有这个注解。麦有没有啊,这个类上面。有吧有吧,哎,那么判断下死钝呢。判断string上有没有,String上肯定没有啊,对吧?哎,判断string类上面是否存在这个注解,那么class string class等于class.four name后,我们直接写上去加va language string,然后我们返回string class,之后我们在这里输出哎,String class,然后点is anno present,然后叫my annotation.class,那么此润这个类上面有没有这个注解呢?那没有啊,那就放呗。
11:31
你看false,你看这就是处啊,对吧,这个就是true,这就是false,那如果为true,那就代表它上边有这个解呀。那如果有这个注解,我们能不能获取这个注解呢?如果有这个注解。对吧?我们可以获取这个注解吗?获取该注解对象,那么如果有如果C,对吧?There is an notation present,我们的my annotation class如果有这个类型,那么获取该注解怎么获取呢?
12:01
来C。用C这个类啊来获取,因为你要获取这个类上的注解嘛。这句话只是判断它有没有如果,If是如果呀,如果有,那你就获取呗,怎么获取,通过类获取叫get annotation。大家看这个。这个方法参数一个MY。如果有这个注解,你就获取到这个注解。那当你获取到这个注解之后。转型啊。这个拿到了。这就是那个注解对象。注解对象,这就是类上面注解对象啊,这就是类上面的注解对象。啊,拿到这个类之后呢,判断这个类上面是否有这个注解,如果有这个注解的话,我们调用它的get annotation这个方法来拿到这个注解,拿到注解来,我们输出这个注解对象来看它的内存地址。
13:08
你看。是吧,类上面的注解对象是长这个德行,你看有没有啊,有你看。对吧,你看输出这么一个东西。有没有啊,拿到了,那拿到这个注解对象之后,如果这个注解里边有数据,比如说string value默认值对吧?Default写一个啊,这个默认值啊是。北京大兴区。有这么一个value属性,那我现在拿到了这个注解对象之后,我想获取这个注解对象的属性怎么获取,获取注解对象的属性怎么办?啊。跟调接口没区别。和调接口没区别啊,就怎么调呢,My not这个东西它的value就行了。
14:07
看见没,非常之简单,如哪里类,如果类上面有这个注解,OK,直接叫get,拿到这个注解调拿到注解对象你都有了,你能不能去调注解对象的属性啊,对吧,点歪了就行了。那它这个注解里不是有Y6属性吗?它是个string啊,所以这块呢,它就可以返回了这个string。输是。是吧,这个北京大兴区是怎么拿到的呀,是因为你这个注解,我们在用的时候是不是采用默认的这种方式啊。这种方式注解里边有个value value值是北京大兴啊,对吧,当然你也可以在这给一个值,你说叫上海浦东区,那如果你指定一个值,这个Y6可以省各位啊,我说Y6是可以省略的,那如果说你这是写的上海浦东区,我再去执行我这个程序,那肯定就是上海东区了,就不是那个默认值了,这个value输出就是上海浦东区了。
15:18
所以这就是胡浪同学刚才问的,我这个地方的value,我能不能获取到,可以通过反射机制来获取。通过反射机制来获取。明白我的意思吧。你看这段代码还是很很很宝贵的很宝贵的啊,通过反射机制去读取我们的注解。啊,我们的注解。这个代码其实很固定,各位啊,拿到这个类,然后呢,判断这个类上是否有这个注解,如果这个类上面有这个注解,我就拿这个注解,拿到注解之后呢,我调注解对象的value这个属性,就拿到这个value吧。这样的话就通过反射机制就可以读了。那就可以读了。那我们看看会不会出问题。
16:04
如果这个注解只被保留在Java源文件当中,我们来执行一下这个程序。是吧,你看是不是这个条件没成立,这里边儿没走啊。这个条件为什么没成立?因为这个类上没有这个注解。有些老师不对啊,这个类上有啊,对不起,这个注解只被保存在什么Java原文件当中,不能被反射机制所读到。啊,不能反射机制所读到,所以这块的话,你得加一个runtime,它才能被反射。啊,加个runtime才能被反射。了解一下,了解一下。是不是,哎,上海浦东区false。拿到了。拿到了。啊。属性那里不是value,怎么获取值?
17:00
同样啊,一样啊。你不是value,你就是别的呗,你要是name属性的话,你就点name就行了。点那点这是方法名,你这是属性名。一样。一样啊。
我来说两句