一、反射
1. 一段java代码在程序运行期间会经历三个阶段: source-->class-->runtime
Person.java—Person.class à 类加载到内存 Person.class –> 创建对象 程序运行
2. Class 对象
在java中用一个Class对象来表示一个java类的class阶段
Class对象封装了一个java类中定义的成员变量、成员方法、构造方法、类名、包名等
3. 反射
反射就是获得一个java类的各个组成部分
对第二个阶段进行解析
4. 反射的用法
1)需要获得java类的各个组成部分,首先需要获得代表java类的 Class 对象
获得Class对象的三种方式:
Class.forName(classname) 用于做类加载
obj.getClass() 用于获得对象的类型
类名.class 用于获得指定的类型,传参用
Person.class String.class int.class int[].class void.class
2) 反射类的成员方法
Class clazz = Person.class;
Method method = clazz.getMethod(methodName, new Class[]{paramClazz1, paramClazz2});
method.invoke();
3) 反射类的构造函数
Constructor con = clazz.getConstructor(new Class[]{paramClazz1, paramClazz2,...})
con.newInstance(params...)
4) 反射类的属性
Field field = clazz.getField(fieldName);
field.setAccessible(true); // 由于属性私有就不能直接访问了,所以需要取消java的访问权限检查
field.setObject(value);
field.getObject();
5. 反射用在哪里
到底框架是什么? 框架就是将开发中大量重复的代码集中起来写个通用的程序
框架就是用反射来实现的
框架是一个通用的程序,这个程序是无法运行的,是缺少零部件的,零部件需要将来使用框架的人组装进来
框架需要现在的类调用将来写的类
框架是将来的程序员调用的,框架不能实现完整的功能,框架只是一些一些通用的代码
框架要运行一定会依赖将来写的类
现在写的类要调用将来写的类,我们先针对接口进行调用,将来的类需要实现接口,那么方法就固定了
但是将来写的类的类名我们无法获知,这时就需要调用者通过配置文件告诉框架具体的类名
二、 泛型
1. 泛型是一种可变化的类型
类型不确定,需要调用者来指定
2. 用途:
一个类的多个成员方法用到的参数类型或返回值类型都是未知的类型,但又需要是同一个类型,就可将方法的
参数类型定义为泛型,此泛型必须在类上先予以声明才能在方法中使用
一个方法的多个参数和返回值需要是同一个类型,也可以用泛型来解决,在返回值前面声明泛型
3. 泛型的基本概念
以List<E>为例:<>念着typeof 例, List<String> 就是 List typeof String
List<E>中的E称为类型参数变量 方法定义参数形式参数
List<Integer>中的Integer称为实际类型参数
整个List<E>称为泛型类型 GenericType
整个List<Integer>称为参数化的类型
4. 泛型的使用
1)使用带泛型的类时,在创建对象时可以为泛型指定实际类型参数,指定的具体类型相当于给泛型传参
2)子类在继承父类的时候,可以为父类定义的泛型指定实际类型参数
class B<T>
class A extends B<String>
通过子类A获得的父类类型就是一个参数化的类型
3)调用方法时传入参数的具体类型将作为方法中泛型的实际类型
三、注解
1. jdk中自带的三个注解
@Deprecated 声明方法已过时
@SuppressWarnings 取消编译器警告
@Override 声明方法是继承自父类
2. 什么是注解
注解就是java代码中的特殊标记,它用于告诉调用者类应该如何被运行
注解相当于配置文件的功能
3. 自定义注解
使用 @interface 关键字可以声明一个注解
public @interface MyAnnotation1
注解中可以定义属性
String name default “aaa”;
value是注解中的特殊属性
注解中定义的属性如果名称为 value, 此属性在使用时可以省写属性名
4.元注解 元Annotation
元注解简单理解为 注解的注解
类似于描述一个注解的信息的配置文件
@Retention 指定注解的作用域
RetentionPolicy.SOURCE
RetentionPolicy.CLASS default
RetentionPolicy.RUNTIME
@Target:指定注解用于修饰类的哪个成员.
@Target 包含了一个名为 value,类型为ElementType的成员变量。
@Inherited: 被它修饰的 Annotation 将具有继承性.
如果某个类使用了被 @Inherited 修饰的 Annotation, 则其子类将自动具有该注解
5. 反射注解
在程序可以通过反射来获取注解中封装的值
四、动态代理
我们可以为某一个对象生成一个代理对象
代理对象要和被代理的对象实现同样的接口
代理对象的方法被调用时,我们可以做一些动作,再去调用真正被代理对象的方法
在代理对象中对用户的权限进行检查
所有的过滤器都可以用代理模式来解决