10-18 程宗武md

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 线程的声明周期

image-20201019230201723

标签

评论

this is is footer