照葫芦画葫芦,傻逼学习是这样的
反射
可以不用import 类
目的是为了获得某个实例的信息
拿到某个Object实例时,我们可以通过反射获取该Object的class信息:
1 | void printObjectInfo(Object obj){ |
动态加载
方法在主函数调用时在加载到内存
使用反射,首先代码非常繁琐,其次,它更多地是给工具或者底层框架来使用,目的是在不知道目标实例任何信息的情况下,获取特定字段的值
1 | // reflection |
调用方法
invoke
1 | invoke(目标对象, 方法参数列表) |
调用构造方法
通过反射创建新的实例
1 | Person p = Person.class.newInstance(); |
Constructor对象封装了构造方法的所有信息;
通过Class实例的方法可以获取Constructor实例:getConstructor(),getConstructors(),getDeclaredConstructor(),getDeclaredConstructors();
通过Constructor实例可以创建一个实例对象:newInstance(Object... parameters); 通过设置setAccessible(true)来访问非public构造方法。
注解
注解(Annotation)是Java语言用于工具处理的标注:
注解可以配置参数,没有指定配置的参数使用默认值;
如果参数名称是value,且只有一个参数,那么可以省略参数名称。
定义注解
1 | public @interface Report{ |
Java使用@interface定义注解;
可定义多个参数和默认值,核心参数使用value名称;
必须设置@Target来指定Annotation可以应用的范围;
应当设置@Retention(RetentionPolicy.RUNTIME)便于运行期读取该Annotation。
处理注解
可以在运行期通过反射读取RUNTIME类型的注解,注意千万不要漏写@Retention(RetentionPolicy.RUNTIME),否则运行期无法读取到该注解。
可以通过程序处理注解来实现相应的功能:
- 对JavaBean的属性值按规则进行检查;
- JUnit会自动运行
@Test标记的测试方法。
泛型
泛型就是编写模板代码来适应任意类型;
泛型的好处是使用时不必对类型进行强制转换,它通过编译器对类型进行检查;
注意泛型的继承关系:可以把ArrayList<Integer>向上转型为List<Integer>(T不能变!),但不能把ArrayList<Integer>向上转型为ArrayList<Number>(T不能变成父类)。
使用泛型
使用泛型时,把泛型参数<T>替换为需要的class类型,例如:ArrayList<String>,ArrayList<Number>等;
可以省略编译器能自动推断出的类型,例如:List<String> list = new ArrayList<>();;
不指定泛型参数类型时,编译器会给出警告,且只能将<T>视为Object类型;
可以在接口中定义泛型类型,实现此接口的类必须实现正确的泛型类型。
编写泛型
编写泛型时,需要定义泛型类型<T>;
静态方法不能引用泛型类型<T>,必须定义其他类型(例如<K>)来实现静态泛型方法;
泛型可以同时定义多种类型,例如Map<K, V>。
加@Bean注解,在项目启动时调用方法
动态sql写到xml映射文件中
如有错误,多多指教