介绍几个基本的组件

反射是一种具有与类进行动态交互能力的一种机制,你可以在任何时候加载一个不存在的类到内存中,然后进行各种交互,或者获取一个没有公开的类的所有信息。

(java中定义的八种基本类型:boolean、char、byte、short、int、long、float、double)

  • JVM栈

    存放基本类型局部变量,非基本类型的对象在JVM栈上仅存放一个指向堆上的地址。

  • 堆(heap)

    来存储对象实例以及数组值的区域,可以认为Java中所有通过new创建的对象的内存都在此分配,Heap中的对象的内存需要等待GC进行回收。

  • 方法区(Method Area)

    类中的静态变量,类中的Field信息、类中的方法信息

  • 本地方法栈(Native Method Stacks)

    存储每个native方法调用的状态

  • 运行时常量池(Runtime Constant Pool)

    存放的为类中的固定的常量信息,JVM在加载类时会为每个class分配一个独立的常量池,但是运行时常量池中的字符串常量池是全局共享的

java反射与泛型

参考地址:

https://juejin.im/post/5a255e5451882503eb4b1ea2

Class c = Class.forName("com.coderising.kailuncen.Main");

//获取类的所有属性,包括私有的
//同理还可以获取方法和构造函数,私有的也可以
c.getDeclaredFields();

Java注解

元注解:

  • @Documented –注解信息是否将包含在JavaDoc中

  • @Inherited – 是否允许子类继承该注解,定义该注解和子类的关系

  • @Target? –注解用于什么地方

    ElementType.TYPE: 用于描述类、接口或enum声明 ElementType.FIELD: 用于描述实例变量 ElementType.METHOD ElementType.PARAMETER ElementType.CONSTRUCTOR ElementType.LOCAL_VARIABLE ElementType.ANNOTATION_TYPE 另一个注释 ElementType.PACKAGE 用于记录java文件的package信息

  • @Retention– 什么时候使用该注解,定义该注解的生命周期,很重要,必须指定,以下是3种生命周期的介绍

    1,RetentionPolicy.SOURCE (注解只在源文件中保留,它们不会写入字节码。@Override, @SuppressWarnings都属于这类注解。)

    2,RetentionPolicy.CLASS (注解保留到.class文件中,在类加载的时候丢弃。在字节码文件的处理中有用。注解默认使用这种方式。)

    3,RetentionPolicy.RUNTIME (注解一直保留到内存中,类加载器把.class文件加载到内存中产生的字节码中要保留注解信息,始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注解的信息。我们自定义的注解通常使用这种方式。

上代码看看:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
    ElementType[] value();
}

=》 @Target(ElementType.METHOD)

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

=》 @Override

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface OnClick {
    int value() default 0;
}
@OnClick(R.id.test_btn)
void test(){
    test_tv.setText("恭喜您,绑定成功了!");
}

自定义注解注意事项:

1,使用@interface定义一个注解类,其内部自行继承了Annotation类

2,当注解的参数只有一个时,建议用value作为参数名,这样在使用注解时,可以直接写参数的值

注解的优势

使用注解可以明确开发过程中的一些数据类型,还可以对一些数据进行限制,从而提高开发效率。


编译时注解之APT

传统注解:

运行期(RunTime)利用反射去获取信息,比较耗性能。

编译期注解:

主要手段是APT和Javapoe

编译期注解原理:

在某些代码元素上(如类型、函数、字段等)添加注解,在编译时编译器会检查AbstractProcessor的子类,并且调用该类型的process函数,然后将添加了注解的所有元素都传递到process函数中,使得开发人员可以在编译器进行相应的处理,例如,根据注解生成新的Java类,这也就是ButterKnife等开源库的基本原理。

APT(Annotation Processor Tool),即注解处理器

什么是APT?

APT是一种处理注解的工具,确切的说它是javac的一个工具,它用来在编译时扫描和处理注解,一个注解的注解处理器,以java代码(或者编译过的字节码)作为输入,生成.java文件作为输出,核心是交给自己定义的处理器去处理。

学习参考链接:https://juejin.im/post/584d4aa00ce463005c5dbc36

results matching ""

    No results matching ""