黑马程序员------Java的注解与类加载器

来源:互联网 发布:苹果电脑删除不了软件 编辑:程序博客网 时间:2024/06/08 13:09

---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ---------------------- 

 

微笑了解注解的应用

 

注解相当于一种标记,在程序中加入了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器

开发工具和其他程序可以用反射来了解你的子类及各种元素上有无何种标记。看你有什么标记,就去干相应的事。标记就可以

加在包、类、字段、方法的参数以及局部变量上。

 

根据java.lang包,可知JDK中提供的最基本的annotation为:@SuppressWarnings,@Deprecated,@Override

 

一个注解就是一个类,注解就相当于一个你的源程序中要调用一个类,要在源程序中应用某个注解,得先准备好了这个注解类。

就像你要调用某个类,得先开发好这个类。

 

微笑注解的定义与反射调用

 

 

package com.lee.demo;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;//元注解RetentionPolicy.SOURCE,RetentionPolicy.CLASS,RetentionPolicy.RUNTIME分别对应//java源文件-->class文件-->内存中的字节码。@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD,ElementType.TYPE})public @interface LeeAnnotation {String color()default "blue";String value();int[] arrAttr() default{1,2,3};EnumTest1.TrafficLamp lamp() default EnumTest1.TrafficLamp.RED;MetaAnnotation annotationAttr() default @MetaAnnotation("dog");}

 

package com.lee.demo;public @interface MetaAnnotation {String value();}

 

package com.lee.demo;import com.lee.demo.EnumTest1.TrafficLamp;//arrAttr 这里属性只有一个元素,可以直接写arrAttr=1@LeeAnnotation(value = "xyz",arrAttr=1,lamp=TrafficLamp.YELLOW, annotationAttr = @MetaAnnotation("cat"))public class AnnotationTest {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubif(AnnotationTest.class.isAnnotationPresent(LeeAnnotation.class)){LeeAnnotation lee = AnnotationTest.class.getAnnotation(LeeAnnotation.class);System.out.println(lee);//以方法调用的方式取值System.out.println(lee.color());//已经指定默认值System.out.println(lee.value());//取数组的长度System.out.println(lee.arrAttr().length);//枚举类型System.out.println(lee.lamp());//枚举的枚举System.out.println(lee.annotationAttr().value());}}}

 

微笑类加载器

 

java虚拟机中可以安装多个类加载器,系统默认三个主要的类加载器,每个类加载器负责加载特定位置的类

BootStrap,ExtClassLoader,AppClasLoder

类加载器也是java类,因为其他是java类的类加载器本身也要被类加载器加载,显然必须有一个类加载器

不是java类,这正是BootStrap。

 

1.首先当前线程的类加载器去加载线程中的第一个类。

2.如果A中引用了类B,Java虚拟机将使用加载类A的类装载器来加载类B

3.还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类。

 

委托机制:

当所有祖宗类加载器没有加载到类,回到发起者类加载器,还加载不了,则抛出ClassNotFoundException,

不再去找加载器的儿子,因为没有getChild方法。

 

---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ---------------------- 

详情请查看:http://edu.csdn.net

 

原创粉丝点击