介绍几个基本的组件
反射是一种具有与类进行动态交互能力的一种机制,你可以在任何时候加载一个不存在的类到内存中,然后进行各种交互,或者获取一个没有公开的类的所有信息。
(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反射与泛型
参考地址:
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文件作为输出,核心是交给自己定义的处理器去处理。