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

---------------------- 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 stub
	
		if(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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值