------- android培训、java培训、期待与您交流! ----------
1.注解Annotation的工作原理:
jdk1,.5中提供了注解功能,允许开发者自定义和使用自己的注解类型。Annotation并不直接影响代码的语义,但是他可以被看做是程序员的工具,他反过来对程序的语义有所影
响!
注解语法比较简单除了@符号使用,其他和java一样。java中内置了3种注解,定义在了java.lang包中。
@Override 表示当前方法是覆盖父类的方法。
@Deprecated表示当前元素不赞成使用,是过时的方法!
@SuppressWarnings表示编译器警告如:SuppressWarnings("deprecation").//表示不要提示方法过期!
一个注解就是相当于一个类,上面的注解就是相当于创建了一个类!
注解的作用:相当于一种标记,在程序中加了注解,就相当于为程序打上了标记。没加就相当于没标记,以后javac编译器,开发工具,可以反射来了解你的类和各种元素上的标记。
首先来创建一个注解类:
public @interface Test { }
这就是一个注解,当然你要为他添加元注解,才能更好的使用!
@Rentention()是声明生命周期的注解,表示注解要留到哪一个阶段?可选的参数有RententionPolicy包括:
RetentionPolicy.SOURCE 注解将被编译器丢弃
RetentionPolicy.CLASS 注解在class文件中可用,但会被JVM丢弃
RetentionPolicy.RUNTIME JVM将在运行期也保留注释,因此可以通过反射机制读取注解的信息
@target()表示注解该用到什么地方?可选参数有ElenmentType:
ElementType.FIELD域声明,
ElementType.PARAMETER参数声明,
ElementType.METHOD方法声明
等等。
需要注意的是:写属性的时候必须是@Annotation(color = “red”)!只有是value属性才可以直接写入!
如何反射获取注解呢?
首先获得Class来通过isAnnotationPersent(Test.Class);判断注解是否为指定注解!
在调用getAnnotation()来获得该注解。由于注解也是个类!这样就可以通过类的方式来获取注解属性了!
--------------------------------------------------------------------------------------
关于类加载器的东西还是简单说一下吧:
jvm中有多个类加载器负责加载特定的类!
类加载器也是java类,元是bootstrap加载器,是c++的jvm内核。是特殊的一个,他加载的类有System类等等。
有高级到低级(或者有父辈到子辈):
BootStrap-------------------加载------------------->JRE\lib\rt.jar
|
ExtClassLoader----------加载-------------------->JRE\lib\ext\*.jar
|
AppClassLoader----------加载------------------->Classpath下的jar或目录
|
自己的类加载器-----------加载-----------》特定目录
以上的图为类加载器的关系,我们可以看出来加载的层次!
那么当java虚拟机要加载一个类的时候,到底该派出哪个类来加载?
1首先当前线程类加载器去加载线程中的类。
2如果类a引用类b,那么java虚拟机会使用加载类a的加载器加载类b
3.每个加载器优先委托给上一级加载器!当所有父加载都不行,会有异常!
问题:你自己写你个java.lang.System可不可以?
答案是不一定,我们自己写的会在ClassPath下那么加载器还是BootStrap优先加载,会加载程序自带的,不会加载我们的。但是我们可以自己写一个类加载器!
------- android培训、java培训、期待与您交流! ----------