反射:java.lang.reflect
1、对程序中已装载到JVM里的对java对象,动态获取描述信息,动态调用对象方法——在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有方法和属性)。
2、步骤:
①获得类的Class对象实例。
A、Class a=Class.forName(类的全路径名);
//静态方法forName,直接获取一个类的字节码文件对象(.class)。此时该类为源文件阶段,还没转换成字节码文件。
B、编译前知道操作的类。Class a=A.class;
//类加载成.class文件。获取自己。该类处于字节码阶段。
如基本数据类型:Class a=int.class
或Class a=Integer.TYPE
C、类对象的getClass()方法:Class a=aa.getClass();
//类的实例获取类的字节码文件对象。
②获取反射类对象。
A、Class对象的newInstance()方法。只能使用默认的无参构造。
Dog dog=(Dog)a.newInstance();
B、根据Class对象获取Constructor对象,使用Constructor对象的newInstance()方法。可选特定构造方法。
Constructor constructor=a.getConstructor();
Dog dog=(Dog)constructor.newInstance();
//Dog dog=(Dog)constructor.newInstance("Tom",15);
若调用方法:③获取方法的Method对象。
④invoke()调用。
注:运行期间,一个类只有一个Class对象产生。
3、Class对象可访问的描述信息:
getFields()和getMethods():可获得从超类中继承的成员变量和方法。不含私有属性。
getDeclaredFields和getDeclaredMethods:获得从本类中定义的成员变量和方法。包括私有属性。
4、访问构造方法:返回Constructor类型的对象/数组。
Constructor类常用方法:
由java.lang.reflect.Modifier类解析出getModifiers()方法的返回值表示的修饰符信息。静态方法有:
5、访问成员变量
返回Field类型的对象/数组。
获取成员变量:a.getDeclaredField("…")
方法:
6、访问方法
返回Method类型的对象/数组。
方法:
【声明】参考资料:
https://www.cnblogs.com/chanshuyi/p/head_first_of_reflection.html
https://www.cnblogs.com/whgk/p/6122036.html
Annotation
用于各类声明中。不影响程序运行,会影响编译器警告。
1、关键字:@interface,继承java.lang.annotation.Annotation接口。
定义:①Marker Annotation:不含成员
public @interface NoMemberAnnotation{};
②仅一个成员
public @interface OneMemberAnnotation(){ String value(); }
类型:String、Class、primitive、enumerated、annotation及其数组。
名称:通常叫value。
③一/多个成员
注:可设置默认值。
String str() default "<默认值>"
Class class() default int.class
2、@Target设置Annotation类适用的元素种类。未设置则适用于所有。
常用:枚举类ElementType的枚举常量。
3、@Retention设置有效范围。未设置则有效范围为枚举常量CLASS表示的范围。
枚举类RetentionPolicy类的常量。
分别对应:.java文件,.class文件,字节码文件。
@Target(ElementType.CONSTRUCTOR)
@Retention(Retentionpolicy.RUNTIME)
public @interface Annotation1{
String str();
Class type() default int.class;
}
4、@Deprecated:废弃的,过时的
@Override:重写、覆盖
@SuppressWarnings:压缩警告
5、Constructor、Field、Method均继承AccessibleObject类。该类有三个方法:
boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
:查看是否已添加指定类型的Annotation
getAnnotation(Class<T> annotationClass)
:获取指定类型Annotation,存在返回相应对象,否则null
getAnnotation()
:获取所有的Annotation。返回数组。
Constructor、Method定义了方法getParameterAnnotations()
:获取为所有参数添加的注释。返回Annotation类的二维数组,数组顺序与声明顺序相同。无参返回长度0的数组;参数未添加注释的,返回长度0的嵌套数组/占位?/。