2020-04-13注解和反射
注解存在三个位置:
【2】自定义注解+反射使用
【3】ElementType:注解使用范围
【4】RetentionPolicy:指定注解存活的位置。
- source \ class【默认】 \ runtime
- 保留Java文件当中 \ 保留class文件当中【默认】 \ 在JVM执行过程当中依旧能够获取
【5】@interface 自定义注解——默认只存在于class文件当中;如果要要实际开发中被反射获取,需要使用元注解。
【6】@Documented :doc文档、注释;将注解写入到doc文档中
【7】@Target:参数包括,ElementType.[TYPE\FIELD\CONSTRUCTOR\METHOOD\PARAMETER\]
【8】@Retention:参数,RetentionPlolicy.[RUNTIME]
【9】给注解添加属性:【1】生命抽象方法【2】添加默认值
ex:
public String value1() default “”;
public int value2();
常规的内置注解
【1】@Deprecated:过时内容
【2】@Override:重写的方法
【3】@SuppressWarnings:取消编译器的警告
【4】@Functional Interface:函数式接口、匿名接口
【5】@SafeVarargs:用于忽略泛型导致的,所以往往 + final 联合应用
【6】@Rpeatable: 多次使用
-
反射
【1】框架开发、框架升级——学习华为自定制!
【2】开源框架的问题:安全性无法保障!网络渗透漏洞问题!
【3】黑客攻击——明白网页安全的重要性!
-----------
【1】常规情况:一个类的执行,从源文件开始,经过编译,然后加入类加载器中,然后再执行该程序。——预加载
【2】反射:程序已经在执行了,执行过程当中,获取类、方法、属性等,然后再组织到当前类加载器当中。——动态执行
Class类
【1】Object用于描述对象的类。
【2】Class:描述类的类。
【3】获取Class类:
-通过类名获取class:Class.forName([完全类名——包命+类名]);{如果无法定位到类,会抛:ClassNotFoundException异常} --一般是在配置文件当中获取的字符串
-通过对象获取:new Person().getClass();一般用于类型不确定的参数传递
-通过类获取:Person.class。 一般是明确类型的参数传递
【4】创建实例
clazz.newInstance()——创建的实例,默认实际是调用目标类的空参构造{抛异常: noSuchMethodException异常}
【5】获得该类基本信息
clazz.getPackage():完整包名+类名
clazz.getSimpleName()
clazz.getSuperclass()
clazz.getInterfaces()
【6】获得类内部信息
Field:类的属性
clazz.getField(属性名)——只能访问可见的成员
clazz.getDeclaredField(属性名)——访问所有成员{NoSuchFieldException}
field.setAccessible(true);——设定访问权限为可见【如果访问的是私有的成员】{并且如果不操作则不报错}
field.set(对象,值)
clazz.getFields()——获取所有可见成员
clazz.getDeclaredFields()——获取所有的成员
field.getName()
field.getType().getSimpleName()
field.getType()——获取属性类型
==================================
Method method = clazz.getMethod(方法名,参数类型)
method.invoke(对象,参数);//执行方法
struts
加强训练:成本控制!
-代码驾驭;异常处理;bug解决问题;
注解、XML作用:读取配置信息。
注解对于大型项目,反而不好管理。
异常:程序继续执行:catch;不往下执行,throw