反射技术
基本概念:
使用反射机制可以动态获取当前class的信息,比如方法的信息,注解信息,方法的参数,属性等;
反射技术应用的场景
- JDBC加载驱动链接 class.forname
- Spring容器框架IOC实例化对象
- 自定义注解生效(反射+AOP)
- 第三方核心的框架
UserEntity userEntity = (UserEntity) aClass.newInstance();
Field userId = aClass.getDeclasreField("userId");
userId.setAccessible(true);(关闭java语言的访问检查,就是反射时不会去检查调用是否符合语言规范;同时获取权限,设置为true后,就可以在外部通过反射和调用private属性和方法)
userId.set(userEntity,12)
// 其他方法
aClass.getDeclaredAnnotation(Transactional.class)// 获取当前类是否有Transactional注解 Annotation:注解 Declared:声名(当前类),不加Declared会获取到父类都会获取,加上Declared的只会获取到当前类的方法
自定义注解
元注解:(需要注解能够生效时使用)
@Retention:标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问
@Documented:标记这些注解是否包含在用户文档中
@Target:标记这个注解应该是哪种java成员
@Inherited:标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)
@Taget(ElementType.METHOD) // 当前注解只能用在方法上
// @Taget(ElementType.METHOD,MElementType.RIELD)
@Retention(RetentionPolicy.RUNTIME) // 运行时可获取
public @interface ExtTransactional{
String name();
Integer age();
}