首页 > 其他 > 详细

注解和反射

时间:2021-01-26 15:18:38      阅读:19      评论:0      收藏:0      [点我收藏+]

注解

内置注解
  • @Deprecated:过时
  • @SuppressWarnings(参数):抑制警告信息,不发黄代码, 类/方法上
    • all:所有
    • unchecked:告诉编译器忽略 unchecked 警告信息,如使用List,ArrayList等未进行参数化产生的警告信息。
元注解

负责注解其它注解

  • @Target:用于描述注解的范围,即被描述的注解可以用在什么地方
  • @Retention:表示需要在什么级别保存该注释信息,用于描述注解的生命周期 source<class<runtime
  • @Documented:说明该注解将被包含在javadoc中
  • @Inherited:说明子类可以继承父类中的注解
自定义注解
定义
@Target({ElementType.METHOD, ElementType.TYPE})//mehtod:方法上有效,type:类上有效
@Inherited//子类可以继承父类中的注解
@Retention(RetentionPolicy.RUNTIME)//Retention 表示注解在什么时候才有效,runtime(运行时)>class(class文件)>source(源码)
@Documented//Documentd 表示是否将我们的注解生成在java doc中
public @interface MyAnnotation {
    //参数类型+参数名()
    String name() default "";

    int age() default 0;

    int id() default -1;//如果默认值为-1,代表不存在

    String[] schools() default {"清华", "北大"};
}
使用
class Test {
    @MyAnnotation(age = 18, name = "zs")//参数不考虑顺序
    public void test() {

    }
}

反射

反射机制

允许程序在执行期借助Reflection api取得任何类的内部信息,并能操作任意对象的内部属性及方法

  • 正常方式:引入需要的"包类"名称-》new 实例化-》取得实例化对象
  • 反射:实例化对象-》getClass()方法-》取得完整的"包类"名称
Class类
  • Class cla=类.class

  • 对象.getClass()

  • Class.forName(全限定类名)

技术分享图片

java类加载机制
  1. 加载:类加载器classloader把编译过的class文件读到内存,产生对应的class对象
  2. 链接:二进制代码合并到jvm运行状态之中
    • 验证:确保类信息符合jvm规范,安全
    • 准备:为static变量分配内存设置默认初始值,这些内存在方法区中分配
    • 符号引用(常量名)替换为直接引用(地址)
  3. 初始化
    • 执行类构造器clinit方法,收集类中所有类变量赋值动作和静态代码块中的语句合并起来(类构造器是构造类信息)

    • 父类没有初始化就先初始化父类

      • 类的主动引用:会发生类的初始化

        • 先初始化main
        • new 对象
        • 调用类的静态成员(除了final常量)和静态方法
        • Class.forName反射调用
        • 父类没有初始就先初始化父类
      • 类的被动引用,不会发生类的初始化

        • 通过子类引用父类的静态变量,不会导致子类初始化
        • 通过数组定义类引用,不会发生此类初始化
        • 引用常量不会发生类初始化(常量在连接阶段就存入调用类的常量池中了)
    • 虚拟机会保证一个类的clinit方法在多线程环境中被正确加锁和同步

类加载器

技术分享图片

自定义类加载器->系统类加载器->扩展类加载器->根加载器(c/c++)->

//1.系统类加载器
ClassLoader sysCl=ClassLoader.getSystemClassLoader();
//2.系统类加载器的父类->扩展类加载器
ClassLoader parent=sysCl.getParent();
//3.扩展类加载器的父类->根加载器(引导类加载器)
ClassLoader parent1=parent.getParent();//c/c++开发,无法获得,null
//系统类加载可以加载的路径:
System.getProperty("java.class.path");

注解和反射

原文:https://www.cnblogs.com/jpymll/p/14329829.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!