注解<很难学>和泛型<<最难学的新特性>>类加载器<不算难>
都是个人理解. 注解和泛型也是1.5的新特性;
注解/annotation:相当于一种标记也是一种特殊的类
注解就相当于一个你的源程序中要调用的一个类,要在源程序中应用某个注解,得先准备好了这个注解类。就像你要调用某个类,得先有开发好这个类。
@MyAnnotation 在程序中创建了一个对象;
注解的三个阶段也就是三个生命周期:1)源程序阶段/source.2).class 阶段3)远行时阶段runtime.
例:@Retention (RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
注解的属性 为注解增加属性,就是在注解类里增加抽象方法
例:1、@MyAnnotation(color="red");
String color() default "yellow"; 增加默认值;
注解的属性一般有数组类型的,枚举类型的,注解类型的。
总之我的理解 1,定义注解 @interface 注解名 抽象方法 2 使用注解 在类或方法(8个地方)前面使用@注解名 属性
我们写程序要扫描.Java中的注解,要解决哪些问题,读取每一样,在第一个中查找@,找到的@再去查询一个列表,如果@后面的内容出现在列表中,就说明这是一个我能处理和想处理的注解,否则,就说明它不是一个注解或者说至少不是一个我感兴趣和能处理的注解.接着就编写处理这个注解的相关代码.
泛型的理解
简单的说就是使用了泛型的集合,可以把存入集合的元素限定成一个特定的类型,集合中只能存同一类型的对象.这样就不用对对象强制类型转换.
ArrayList<Integer> al1 = new ArrayList<Integer>();
ArrayList<String> al2 = new ArrayList<String>();
al1.getClass() = = al2.getClass()结果为true.也就是说字节码相同 编译器忽略泛型的类型
Vector<Object> v = new Vector<String>(); //错误
Vector v1 = new Vector<String>();
Vector<Object> v2 = v1; 这样可以,因为编译器是一行一行检查.
理解泛型集合的重要程序
HashMap<String,Integer> hm = new HashMap<String,Integer>();
hm.put("zxx",19);
hm.put("lis",18);
Set<Map.Entry<String,Integer>> mes= hm.entrySet();
for(Map.Entry<String,Integer> me : mes) {
System.out.println(me.getKey() + ":" + me.getValue());
}
泛型中的通配符” ? ” , 限定通配符包括自己.
限定通配符的上边界Vector<? extends Number> x = new Vector<Integer>();
限定通配符的下边界Vector<? super Integer> x = new Vector<Number>();
Collection<?> a可以与任意参数化的类型匹配
自定义泛型
C++用模板函数解决template
<T>只有引用类型才能作为泛型方法的实际参数
类型参数的类型推断
Private static<T> void copy(Collection<T> a,T[] b)
copy(new Vector<String>(),new Integer[ ]{}) //不行,推断必须为同一类型
泛型类:
类名后加<T> 泛型价值是规定所有的方法要统一,当类定义成泛型类,new对象也要加上 类<泛型> 变量 = new 类<泛型>();
静态的方法不能使用类上面的泛型 内部类可以用类类义的泛型
通过反射获得泛型的参数化类型
getrReturnType(); getGenericReturnType(); parameterizedType;
class,enum,interface,@interface都是Java类的一种类型
最后学了类加载器
类加载器的三种方式 BootStrapàExtClassLoaderàAppClassLoader
JRE/lib/rt.jar JRE/lib/ext/*.jar CLASSPATH指定的所有Java或目录
每个ClassLoader本身只能分别加载特定位置和目录中的类,但他们可以委托其它的类加载器去加载类,这就是类加载器的委托模式。类加载器一级级委托到BootStrap类加载器,如果类A中引用了类B,还可以直接调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类。