8 反射和注解
约 1503 字大约 5 分钟
2025-04-05
反射允许对封装类的字段,方法和构造函数的信息进行编程访问 反射就是:加载类,并允许以编程的方式解剖类中的各种成分(成员变量、方法、构造器等)。
工具类 | 作用 |
---|---|
Class | 获取class对象 |
Constructor | 获取构造方法 |
Field | 获取成员变量 |
Method | 获取成员方法 |
获取class对象
三种方法:
- Class.forName("全类名"); 编码阶段使用
- 类名.class 加载阶段(将字节码文件加载到内存中),一般当作参数进行传递
- 对象.getClass(); 运行阶段,当有这个类的对象时才使用
全类名:包名+类名
获取构造方法Constructor
Class的成员函数
成员函数 | 作用 |
---|---|
Constructor<?>[]getConstructors) | 返回所有公共构造方法对象的数组 |
Constructor<?>[]getDeclaredConstructors() | 返回所有构造方法对象的数组 |
Constructor<T> getConstructor(Class<?>.parameterTypes) | 返回单个公共构造方法对象 |
Constructor<T> getDeclaredConstructor(Class<?>...parameterTypes) | 返回单个构造方法对象 |
T newlnstance(Object...initargs) | 根据指定的构造方法创建对象 |
setAccessible(boolean flag) | 设置为true,表示取消访问检查 |
Class clazz=Class.forName("com.itheima.Student");
Constructor con3=clazz.getonstructor(int.class);
System.out.println(con3);
获取指定参数的构造方法传入的也要是该类型的字节码文件
获取形参列表
Constructor的成员函数
成员函数 | 说明 |
---|---|
Parameter[] getParameters(); | 获取构造函数的形参列表 |
<T> newInstance(T ...initargs) | 传入获取到的构造函数新建一个对象,但无法使用私有构造 |
void setAccessible(boolean flag) | 临时取消权限校验 |
con4.setAccessible(true);//con4是一个私有的构造函数,需要取消权限校验才能调用
Student stu =(Student)con4.newInstance(..initargs:"张三",23);
System.out.println(stu);
利用反射获取成员变量
Class中的方法
成员函数 | 说明 |
---|---|
Field[] getFields() | 返回所有公共成员变量对象的数组 |
Field[] getDeclaredFields() | 返回所有成员变量对象的数组 |
Field getField(String name) | 返回单个公共成员变量对象根据成员变量名获取 |
Field getDeclaredField(String name) | 返回单个成员变量对象根据成员变量名获取 |
Fieldggender =clazz.getField()"gender");
System.out.println(gender);
Field类中用于创建对象的方法
成员函数 | 说明 |
---|---|
void set(Object obj, Object value) | 赋值 |
Object get(Object obj) | 获取值 |
int getModifiers() | 获取权限修饰符 |
String getName() | 获取成员变量名 |
Class<?> getType() | 获取成员变量类型 |
获取成员方法
Class类中的
成员函数 | 说明 |
---|---|
Method[] getMethods() | 返回所有公共成员方法对象的数组,包括继承的 |
Method[] getDeclaredMethods() | 返回所有成员方法对象的数组,不包括继承的 |
Method getMethod(String name, Class<?>.. parameterTypes) | 返回单个公共成员方法对象 |
Method getDeclaredMethod(String name, Class<?>...parameterTypes) | 返回单个成员方法对象 |
Method类中用于创建对象的方法
成员函数 | 说明 |
---|---|
Objectinvoke(Objeectobj,Object... args) | 运行方法.参数一:用obj对象调用该方法 参数二:调用方法的传递的参数(如果没有就不写) 返回值:方法的返回值(如果没有就不写) |
Class[] getExceptionTypes() | 获取抛出的异常 |
成员函数 | 说明 |
---|---|
String value() | 获取注解的值 |
使用同样的函数也能获得方法的修饰符,形参,名字等
获取注解
成员函数 | 说明 |
---|---|
Annotation[] getAnnotations() | 获取所有注解 |
Annotation getAnnotation(Class class) | 获取单个注解 |
Field getDeclaredField(String name) | 根据名字获取指定名字成员的注解 |
成员函数 | 说明 |
---|---|
String value() | 获取注解的值 |
注解
从Java5开始,Java 增加了对注解(Annotation)的支持,它是代码中的一种特殊标记,可以在编译、类加载和运行时被读取,执行相应的处理。开发人员可以通过注解在不改变原有代码和逻辑的情况下,在源代码中嵌入补充信息
内置注解
@Override:定义在java.lang.c1.Override中,此注释只适用于修辞方法,表示一个方法声明打算 重写超类中的另一个方法声明
@Deprecated:定义在java.lang.Deprecated中,此注释可以用于修辞方法,属性,类,表示不 鼓励程序员使用这样的元素,通常是因为它很危险或者存在更好的选择
@SuppressWarnings:定义在java.lang.SuppressWarnings中,用来抑制编译时的警告信息 与前两个注释有所不同,你需要添加一个参数才能正确使用,这些参数都是已经定义好了的, 我们选择性的使用就好了, @SuppressWarnings("all") @SuppressWarnings("unchecked") @SuppressWarnings(value={"unchecked","deprecation"})等
元注解
元注解的作用就是负责注解其他注解,Java定义了4个标准的meta-annotation类型,他们被用来 提供对其他annotation类型作说明
类型和它们所支持的类在java.lang.annotation包中可以找到:
- @Target : 用于描述注解的使用范围(即:被描述的注解可以用在什么地方) 使用value参数指出可使用的类型
@target(value=ElementType.METHOD)
@interface MyAnnotation{}
多个类型都可使用该注解需要将类型用大括号列出来
@Target(value ={ElementType.METHOD, ElementType.TYPE})
@interfaceMyAnnotation{}
- @Retention : 表示需要在什么级别保存该注释信息,用于描述注解的生命周期 表示该注解在什么时期还有效 value参数用来指出生命周期 SOURCE : 源码时期 CLASS : 字节码时期 RUNTIME : 运行时
@Target(value={ElementType.METHoD,ElementType.TYPE})
@Retention(value=RetentionPolicy.RUNTIME)
@interface MyAnnotation{}
- @Documented : 说明该注解将被包含在javadoc中
- @lnherited : 说明子类可以继承父类中的该注解
自定义注解
使用@interface自定义注解不加@只能是接口
@interface MyAnnotation{
}
在注解中添加成员变量需要在成员变量名后添加小括号 在使用注解时没有默认值的成员变量必须要传参 可以使用defalut设置默认值,使用大括号传入数组
@interface MyAnnotation{
String name()default"";
int age();
String[] schools();
}
@MyAnnotation(age=10,schools={"a","b"})
public void test(){
}
贡献者
版权所有
版权归属:PinkDopeyBug