一、反射
1、可以将各个组成部分分装为其他对象,这就是反射机制
好处:
可以在程序运行过程中操作这些对象
可以解耦,提高程序的可扩展性
2、java代码在计算机中经历的三个阶段&&获取Class对象的方式
Source源代码阶段-----Class.forName(“全类名”),将字节码文件加载进内存,返回Class对象
Class类对象阶段-----类名.class,通过类名的属性class获取
Runtime运行时阶段-----对象.getClass,getClass()方法在Object类中定义着
/*
获取Class对象的三种方式
*/
Class cls1 = Class.forName("cn.learn.domain.Person"); //多用于配置文件,将类名定义在配置文件中,读取文件、加载类
Class<Person> cls2 = Person.class; //多用于参数的传递
Person p = new Person();
Class cls3 = p.getClass(); //多用于对象的获取字节码的方式
3、Class对象功能
获取多个成员变量:
/*
设置值:void set(Object obj,Object value)
获取值:get(Object obj)
忽略访问权限修饰符的安全检查:setAccept(true) //暴力反射
*/
Filed[] getFields() //获取所有public修饰的成员变量
Filed getField(String name)
Filed[] getDeclaredFields() //获取所有的成员变量,不考虑修饰符
Filed getDeclaredField(String name)
获取多个构造方法:
/*
创建对象:T newInstance(Object... initargs)
*/
Constructor<?>[] getConstrutors()
Constructor<T> getConstrutor(类<?>... parameterTypes)
Constructor<?>[] getDeclaredConstrutors()
Constructor<T> getDeclaredConstrutor(类<?>... parameterTypes)
获取多个成员方法:
/*
执行方法:Object invoke(Object obj,Object... args)
获取方法名称:String getName
*/
Method[] getMethods()
Method[] getMethods(String name,类<?>... parameterTypes)
Method[] getDeclaredMethods()
Method[] getDeclaredMethods(String name,类<?>... parameterTypes)
获取类名:
String getName()
二、注解(元数据)
1、作用分类
编写文档:通过代码里标识的注解生成文档
代码分析:通过代码里标识的注解对代码生成分析【使用反射】
编译检查:通过代码里标识的注解让编译器能够实现基本的编译检查【Override】
2、JDK中预定义的一些注解
@Override:检测被该注解的方法是否是继承自父类接口的
@Deprecated:该注解标注的内容,表示已过时
@SuppressWarnings:压制警告 //一般传递参数all @SuppressWarnings("all
")
3、自定义注解(注解本质就是一个接口)
/*
自定义@MyAnno注解
*/
public @interface MyAnno{
}
1、属性:接口中的抽象方法
要求:属性的返回值类型有下列取值
基本数据类型、String、枚举、以上类型的数组
定义了属性,在使用时需要给属性赋值
如果定义属性时,使用default关键字默认初始化值,则使用注解时,可以不进行属性的赋值
如果只有一个属性需要赋值,且属性的名称是value,则value可以省略,直接定义值即可
数组赋值时,值使用{}包裹,若只有一个值,则可以省略
2、元注解(描述注解的注解)
@Target:描述注解能够作用的位置
ElementType取值
type:可以作用于类上
methed:可以作用于方法上
fifld:可以作用于成员变量上
@Retention:描述注解被保留的阶段
@Retention(RetentionPolict.RUNTIME):当前被描述的注解,会保留到class字节码文件中,并被JVM读取到
@Documented:描述注解是否被抽取到api文档中
@Inherited:描述注解是否被子类继承