Java【U13?

反射:java.lang.reflect

1、对程序中已装载到JVM里的对java对象,动态获取描述信息,动态调用对象方法——在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有方法和属性)。

2、步骤:
①获得类的Class对象实例。
A、Class a=Class.forName(类的全路径名);//静态方法forName,直接获取一个类的字节码文件对象(.class)。此时该类为源文件阶段,还没转换成字节码文件。

B、编译前知道操作的类。Class a=A.class;//类加载成.class文件。获取自己。该类处于字节码阶段。
如基本数据类型:Class a=int.classClass 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的嵌套数组/占位?/。

【声明】参考资料:
https://www.cnblogs.com/xdp-gacl/p/3622275.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值