基础加强--框架加强
新特性
Static Import : 静态导入,当前类中可以直接使用静态资源(字段|方法)
格式:import static java.lang.Math.*;
Varargs :可变参数
public void demo(String... args){ 当成数组使用 }
Autoboxing/Unboxing 自动装箱、自动拆箱(基本类型 <–> 包装类)
装箱:基本类型 --> 包装类。例如:Integer i = 10; --> Integer m = new Integer(10);
拆箱:包装类 --> 基本类型。例如:int j = i; --> int n = m.intValue();
Enhanced for Loop 增强for循环
for(类型 变量 : 容器){} --> 容器:数组、Iterable接口(iterator方法)
Typesafe Enums 枚举
public class Hello {}
public enum Color {}
泛型
特点
1.将运行时的问题提升到编译时
2.方法级别的泛型定义主要是用在工具类中的
public class TestGeneric2 {
public void demo(){
int m = 10;
String s = init("abc");
Integer i = init(123);
}
//方法级别的定义 MyBeanUtils
public <T> T init(T obj){
//算法
System.out.println(obj);
return obj;
}
}
泛型擦除
以下两个方法不能同时存在
public void init(List<String> list){}
public void init(List<Integer> list){}
类型擦除之后,两个方法是完全相同
反射中Class对象的三种获取方式:
Class.forName("全限定类名");
String.class
obj.getClass
反射和泛型混合使用的例子:
public class Dao<T> {
private Session session;
private Class beanClass;
public Dao() {
//1 在运行时,获得当前运行类 父类中泛型的实际参数
//this.getClass().getSuperclass(); //jdk1.4之前,获得父类,不含泛型信息
// * 获得被参数化的类型 ArrayList<Integer> ,含有泛型信息
ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();
//2 获得所有的实际参数类型。类<A,B,C,D> ,返回数组,获得第一个实际参数
Type firstType = type.getActualTypeArguments()[0];
this.beanClass = (Class) firstType;
/*
//回顾 反射 api
beanClass.getName(); //类名
beanClass.getMethod(name, parameterTypes) //方法
beanClass.getConstructor(parameterTypes) //构造
beanClass.getField(name) //字段
*/
System.out.println(beanClass);
}
/* 泛型 ,将运行时问题 提升 编译时
* 泛型实参只有在运行时才可以确定,编译时 T 不能确定类型(User | Book) 只有在运行时才可以确定
* 思想:如何在运行时获得实际类型参数?
*/
public T findById(Integer id){
return (T) session.get(beanClass, id);
}
}
注解
介绍
注解就是类,用于修饰对象(类/构造/字段/方法等),常用语取代xml配置.
但是,开发中常用注解+xml混合使用
JDK提供的常用注解
@Override
在jdk1.5表示子类覆写父类的方法
在jdk1.6表示子类实现父接口的方法
@Deprecated
表示被修饰对象已经过期了,过期的方法依旧可以使用.
以下情况被标记过期:1.安全问题 2.有新的API
@SuppressWarnings
抑制警告,如果有警告通过编辑器不进行警告
deprecation:如果过期不警告
rawtypes:没有泛型
unused:未使用
null:空指针
serial:序列化
all:所有
建议:尽量不使用抑制
自定义注解
注解架构
定义注解
使用注解
解析注解
基本语法
定义注解使用关键字 : `@interface` ,和定义类class相似
public @interface xxx{}
成员格式: 修饰符 返回值 属性名() [default 默认值]
eg: public String username();
注意点:
1.修饰符:默认值 public abstract,且只能是这两个
2.返回值:只能是基本类型/字符串String/Class/注解/枚举,以及以上类型的一维数组.
使用注解—重点!!!
注解出现的目的就是用来代替xml的