00:00
那上午的最后呢,我们提到说如何呢去自定义注解,那自定义注解的话呢,大家就参照一下,这个叫surprise warmings啊参照一它呢,我们去定义呢,其实就可以了,这里边呢,提到这样几个点,那定义完以后,咱们就可以在这个相应的一些这个类当中呢去使用了,比如我们这个person上面呢,加了一个注解,哎,你可以在包括这个像构造器这个位置呢,我们也可以去加个注解,叫my an notation,那因为呢,咱们这个注解呢,已经提供了这个默认值了,所以呢,回过来这个位置呢,其实就可以不写值啊,但是呢,我们要求是一定得赋值啊,只是说呢,你要是没写,呃,这个有默认值了,我就不用写了,你要没有默认值就得需要声明一下啊,这个声明的时候呢,咱们其实是给这个Y6赋值的,其实也可以呢,你把这个Y6等于呢去掉也行,本身呢就这一个成员,所以呢就不用写了,那加上的话呢,相当于是写的比较完整一些啊成这呢,我们就相当于它的一个使用,虽然说使用了,但是大家呢,似乎也感觉不出来,说这有啥用是吧,啥用的话。
01:00
那这就是咱们后边还得涉及到反射了,其实就是这个意思,咱们在这个类上面呢,加了这样的一个声明,这个声明呢,你想干什么,回头咱们利用反射啊,利用反射呢,我去读这个注解,读这些注解呢,再看一下你这个注解值,你是想干什么,然后呢,我们再去做相应的操作。因为咱们现在没有讲反射,再加上的话呢,即使讲了反射,咱们最好还是有个情境,那就意味着咱们还是得靠后讲,到后边这个框架的时候呢,我们再考虑这个事情啊,就比如说咱们上午讲这个这个使用的这个事例的时候。使用这个事例的时候,你看啊,这呢是咱们后边讲web的时候,涉及到一个so的一个结构,在这上面呢,我们加了一个叫web so,我写了个杠叫login,那这个注解加到这以后,不是说你加到这它就立马能自己表现出来一种作用了,嗯,是因为呢,我们通过反射的方式呢,我去读这个注解了,读这些注解呢,我再读它的这个里边的成员的值,知道呢,是杠login,然后这个杠login呢,我在哪写的呢?我是在你这个结构上写的,那就意味着它俩是有关系的。
02:05
那只要你访问这个login这样的一个相当于一个域名下边一个地址,那我呢就去造你这个log啊,Login so的一个对象啊,这样呢,呈现的这个效果跟我们用这个这个叉mout这个文件的格式呢是一样子的,主要呢,就涉及到咱们后边还得用反射啊,去读这个注解才有意义啊,咱们目前的话呢,因为还没有讲反射,所以暂时呢,咱们只能体现成我就放这而已了。啊,这个大家要注意一下啊,你看我在这个PPT当中,我写这个事儿了,说自定义的这个注解呢,你必须配上注解的一个信息处理流程,它才有意义,那信息处理流程,哎,典型的就是咱们用反射呢去实现的,哎这个我把它呢也写到这儿啊信息处理流程这呢,我们就是使用反射啊的方式。嗯,就这块儿呢,大家知道这个事儿就行了,咱们就不在这去演示了,还是到后边咱们用的时候呢,再说OK,这个关于自定义注解呢,咱们就结束了,这个完了以后,下边呢,我们说一下第四个事情,第四个事情什么事情呢?我们再提一个新的概念,叫做圆柱解啊,相当于JDK啊提供的这个算是四种圆柱解。
03:23
圆柱解,什么叫圆柱解,看一下。看这个啊,说JDK当中的这个叫圆柱解,说JDK呢圆anoation呢是用于修饰其他an notation的定义的啊,圆柱解言G呢就是来修饰其他注解的,所以呢,原注解就是修饰其他注解的注解。啊,有点绕啊,这个圆柱解是我们在这里提到一个概念,以后呢,咱们还会涉及到一个概念叫做原数据,在数据库当中呢,咱们会讲到一个叫数据库,呃,结果集的原数据,我们呢,顺便呢,把这个概念呢也给大家去提一下,原数据你可以看作是对现有数据的一个修饰。
04:11
啊,对,现有数据修饰的一个数据就叫做原数据,那么比如说这个咱们都很熟悉了,String name,爱硅谷,这呢算是有三个东西啊,String name和at硅谷,那么问这三个数据,三个这个结构当中哪个是最重要的?对,最核心的内容其实是它啊,这呢是我们真实的这个数据了,而我们的string和name,大家其实可以看作是对它的一个修饰吧,哎,这个数据放到这儿以后,这个瑞呢,表明你这个数据的类型,这个呢是给你这个数据起了个名,一定程度上我们都可以把它呢,如果看作数据的话呢,这两个看成是叫原数据,就是对现有数据进行修饰的一个数据,叫原数据,哎,这个要清楚以后你再看我们这个叫原数解。
05:02
哎,圆柱解呢,就是对现有的注解进行修饰的注解,就叫做圆柱解啊,首先呢,我们把这个概念明确一下,这个圆柱解。哎,先这样在这写一下啊,圆注解就是对现有的注解啊进行解释,哎,说明的这个注解首先呢,落脚点人家也是一个注解,只不过呢,它不是像咱们讲的这个,比如你这写的这个my notation也好,还比如说像这个overwe的也好,Overwe的呢,是来修饰咱们类的这些方法呀,属性啊,类啊等等这些结构的,而我们现在呢,有一种注解呢,是专门用来修饰它的。比如说你打开这个over瑞的,你会发现在这个现有的注解上面还有两个,那这两个呢,其实就是圆柱解,嗯,那么一共有几个呢?这呢,我们提到有四个,刚才咱们看到了这个rotation target,另外呢,还有documented和inherit,那这呢,就是我们要说的这四个啊,Controltr c。
06:05
咱们做一个简单的介绍,CTRLV,整个呢,我们ctrl shift f。这样也行是吧。这样好看还是这样好看,这样啊,那就这样吧,这呢是四个圆柱解,我们分别呢,对这四个圆柱呢,圆柱解呢进行一些解释说明,第一个呢叫做retation,看下PPT retation什么意思?说它呢,是只能用于修饰一个notation定义的啊,因为它是圆柱解嘛,所以指明啊修饰的annoation的生命周期,指明所修饰的annotation的生命周期,它内部呢,定义了一个呃,Rotation policy,其实呢,是一个枚举类了,说这个类里边呢,它有这样的几种状态,第一个呢叫做source,还有一个class,还有一个啊runtime。这样的三种状态分别指明了就是你retention所修饰的那个注解的一个生命周期到底是持续到哪?
07:06
呃,这个呢,看着稍微,其实我这写的也很清楚了啊,我们直接通过代码呢来说明一下,那不妨呢,咱们还以这个叫,呃,咱们这里边说的这个surprise warming啊,然后点开surprise warming,大家呢会看到它上面有一个叫rotation啊,表明它所修饰的这个surprise warming的一个生命周期。生命周期呢叫S,那south是什么意思呢?我们点开这个rotation policy,这其实是个枚举类了,就是这三种状态,这三种状态首先第一个叫做south,说呢,A notation这个注解啊,它将被discarded by the computer。就会被编译器呢所抛弃是吧?那U呢,就是如果我们指定某一个注解,它是S的,就是这个注解在我们这个通过javac这个命令,这不是咱们就相当于编译嘛,通过这个命令呢,咱们要执行完以后呢,是不是会生成这个点卡文件啊,那原一呢,就是在点卡S文件当中啊,它不会保留这个注解的信息。
08:14
就是你这里边呢,如果呢,咱们要反编译去看这个文件,你是看不到这个注解的,因为在编译的时候呢,咱们就给诶discuss了,哎,Discuss了。就这个意思,第二个呢,叫做class。你可以形象点理解,就是咱们那个class文件,就相当于呢,这个注解呢,它将被recorded。保留在我们的class文件当中啊,编译器编译完以后呢,保留在这个class文件中,但是呢,它不会继续保留,当我们通过java.ex命令去执行的时候呢,它就不再加载了,就是相当于不会加载到我们的内存当中,这个呢是咱们的一个默认行为。就像我刚才呢,咱自己定义的这个my not,我是不是也没有指定它的生命周期。
09:03
诶相当于它的生命周期呢,就是咱们这里写到的这个叫class的这个状态,就是编译时候有,但是呢,运营时候呢,不加载。变手有就意味着保留在这个class文件里了,啊,行,这是一个默认行为,再接着一个呢,叫做runtime。Runtime呢,说注解呢,它将被保留在class文件里边,同时呢,它还保留在,呃,就是相当于我们解释运行的时候呢,还加载到内存里了。那你既然加载到内存中了,我们就可以通过反射呢去读取。那反射读取它,我们就看一下你这个注解到底是想干什么,然后我们再去通过反射的方式呢,去做那样的一些事情,相当于就把这个注解呢给用起来了啊,就是这个样子啊,这呢就提到了这样的三种生命周期状态,言外之意呢,就是如果咱们这个需要后边呢,这个用这个注解通过反射呢,还要掉,那你只能是生命成runtime。上面这两个呢,都不行。
10:02
哎,都不行,而咱们这个surprisewing呢,它就是一个编译的时候的一个校验,哎,所以呢,它这个生命周期呢比较短,也用不着在运行的时候呢再去使用了,所以它就是一个source啊成这呢,大家去了解一下,我们提到的叫rotation,呃,它呢就是指定所修饰的啊,所修饰的noation的这个生命周期,我们提到了有这样的三种状态,回忆一下哪三种。S,诶class,诶runtime,那其中呢,注意一下,就是这个class,它是一个默认行为,就是你不指定它就是这种,然后runtime呢,诶这个我们写到这个下边吧。哎,这个只有声明为,哎,这个runtime生命周期的注解。
11:01
哎的这个注解啊,才能通过反射获取,就是后面呢,咱们如果要讲反射呢,去获取一下这个注解,那你必须要求这个注解呢,是一个runtime的,必须在内存中呢去加载才可以啊行,那么这呢,就是关于我们说的reation它的一个说明,哎比较简单,那咱们这呢,没有写,相当于就是一个默认的啊,咱也可以给他去加上,加上的话呢,我们不妨呢,就直接CTRLC,诶直接拿过来这么着一下,这块呢,你要不想用这个sce,诶我们可以来一个叫哎run time。哎,这样呢,我们回头通过反射就可以获取它了,哎,呃,在哪获取,不是在这儿获取啊,是在你使用的时候,比如我们在这儿声明了,我呢就可以获取这个类,它上面所生明的这个注解啊,只要你这个生命周期是runtime就OK了。
我来说两句