10-18 注解、反射、多线程
1、注解
/**
* 注解的使用:
* 1.理解Annotation:
* ①jdk5.0 新增的功能
*
* ②Annotation 其实就是代码里面的特殊标记,这些标记可以在编译,类加载,
* 运行时被读取,并执行相应的处理。通过使用Annotation,程序员可以在不改变原有逻辑的情况下,
* 在源文件中嵌入一些补充信息。代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证
* 或进行部署
*
* ③Annotation可以像修饰符一样被使用,可用于修饰,包,类,构造器,方法,成员变量,参数,
* 局部变量的声明,这些信息被保存在Annotation的"name=value"对中
*
* ④在JAVASE中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等
* 。在JAVAEE/Android中注解占据了更重要的角色,例如用来配置应用程序的任何切面,
* 代替JAVAEE旧版中所遗留的繁冗代码和XML配置等。
*/
* 2.Annotation使用示例:
* 示例一:生成文档相关的注释
* 示例二:在编译时进行格式检查(JDK内置的三个基本注解)
* @Override:限定重写父类方法,该注解只能用于方法
* @Deprecated:用于表示所修饰的元素(类,方法等)已过时,通常是因为所修饰的结构危险或存在更好的选择
* @SupperessWarnings:抑制编译器警告
* 示例三:跟踪代码依赖性,实现提在配置文件功能
* 3.如何自定义注解:参照@SuppressWarnings定义
* ① 注解声明为@interface
* ② 内部定义成员,通常使用value表示
* ③ 可以指定成员的默认值,使用default定义
* ④ 如果自定义注解没有成员,表示是一个标识的作用
* 如果注解有成员,在使用注解时,需要指明成员的值。如果有默认值,则可以不用
* 自定义注解必须配上注解的信息处理流程(使用反射射)才有意义
* 自定义注解通常都会指明的两个元注解:Retention Target
* 4.jdk 提供4中元注解。(元注解:对现有的注解进行解释说明的注解)
* Retention:指定所修饰的Annotation的声明周期:SOURCE\CLASS(默认行为)RUNTIME
* 只有声明为RUNTIME声明周期的注解,才能通过反射获取。
* Target:用于指定被修饰的Annotation能用于修饰那些程序元素
*
* *******出现频率较低*******
* Documented:表示所修饰的注解在被javadoc解析时,被保留下来
* Inherited:被它修饰的Annotation将具有继承性,如果某个类使用了被Inherited修饰的Annotation
* 则其资料类将自动具有该注解
* 5.通过反射获取注解信息
* 6.jdk 8 中注解的新特性:可重复注解、类型注解
* 类型注解:ElementType.TYPE_PARAMETER 表示该注解能写在类型变量的声明语句中(如:泛型声明)
* ElementType.TYPE_USE 表示该注解能写在使用类型的任意语句中
*/
2、反射
获取class对象的方式:
1.Class.forname("全类名"):将字节码文件加载进内存。返回class对象
*多用于配置文件,将类名定义在配置文件中,读取文件,加载类
2.类名.class:通过类名的属性class获取
*多用于参数的传递
3.对象.getClass():getClass()方法在Object类中定义
*多用于对象的获取字节码的方式
*结论:
同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的 Class对象都是同一个
Class对象的功能
*获取功能
1.获取成员变量
*Field[] getFields() :获取所有public修饰的成员变量
*Field getField(String name) :获取指定名称的成员变量
*Field[] getDeclaredFields():获取所有的成员变量,不考虑修饰符
*Field getDeclaredField(String name)
2.获取构造方法
*Constructor<?>[] getConstructors()
*Constructor<T> getConstructor(类<?>... parameterTypes)
*Constructor<?>[] getDeclaredConstructors()
Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
3.获取成员方法
*Method[] getMethods()
*Method getMethod(String name, 类<?>... parameterTypes)
*Method[] getDeclaredMethods()
*Method getDeclaredMethod(String name, 类<?>... parameterTypes)
4.获取类名
*String getName()
*Filed成员变量
*操作:
1.设置值
*void set(Object obj,Object value)
2.获取值
*get(Object obj)
3.忽略访问修饰符的安全检查
*setAccessible(true):暴力反射
*Constructor:构造方法
*创建对象:
*T newInstance(Object...initargs)
*如果使用空参数方法创建对象,操作可以简化:Class对象的newInstance
3、多线程
/**
*##多线程的创建,方式一:继承于Thread类
* 创建一个继承于Thread类的子类
* 重新Thread类的run()
* 创建Thread类的子类的对象
* 通过此对象调用start()
*注:(不能通过直接调用run()方法的方式启动线程)
*##线程的优先级:
* MAX_PRIORITY:10
* MAX_PRIORITY:10
*
*##创建多线程的方式二:实现Runnable接口
* 创建一个实现了Runnable接口的类
* 实现类去实现Runnable中的抽象方法:run()
* 创建实现类的对象
* 将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象
* 通过Thread类的对象调用start()
*##比较创建线程的两种方式
* 开发中:优先原则实现Runnable接口的方式
* 原因:实现的方式没有类的单继承的局限性
* 实现的方式更适合来处理多个线程有共享数据的情况
*/
3.1 线程的声明周期

近期评论