反射与注解

Class类获取类信息

任何类都默认有一个public 静态的Class对象

Class类的对象封装了与类相关的信息,像类的构造方法,成员变量,成员方法

创建Class对象的三个方法

1,Class c1 = 类名.class

2,使用Class类中的静态方法

public static Class forName(String package);

因为java不确定全类名是否正确,所以汇报编译错误,将错误上抛即可

3,使用Object类提供的方法,需要先创建对象

public Class getClass()

多次获取的对象在内存中是一样的

 public static void main(String[] args) throws ClassNotFoundException {
        Class c1 = Cat.class;//创建class对像1
        System.out.println(c1.getName());
        Class c2 = Class.forName("Cat");//创建对象2
        Class c3 = new Cat().getClass();//创建对象3

        //多次获取的对象在内存中是相同的
        System.out.println(c1==c2);
        System.out.println(c1==c3);
    }
利用Class对象获取构造器 

Constructor<?>[]  getConstructors() 获取全部构造器(只包括public 修饰的)

Constructor<?>[]  getDeclaredConstructors()      获取全部构造器(无关修饰符)

Constructor<?> getConstructor(Class<?>...  parameterTypes)     获取某个构造器(只包括public修饰的)

ConStructor<?> getDeclaredConstructor(Class<?>... parameterTypes)        获取某个构造器(无关修饰符)

对于有多个构造器的类获取某个指定构造器时,对后两个方法传参时传构造方法形参数据类型

如某构造器数据类型为int,String,那么获取该构造器时传参(int.class,String.class)

利用构造器对象初始化类对象

利用Constructor类的方法

T newInstance(传参1,传参2)

调用setAccessible(boolean i)       

传值为true,禁止检查访问控制,此时就算构造器被private修饰,也能创建

利用Class类获取成员变量 

public Field[] getFields();

public Field[] getDeclareFields();

public Field getField(String name);

public Field getDeclareField(String name);通过成员变量名定位要获取的成员变量

与获取构造器相似

Field类方法 

void set(Object obj,Object value)             为obj对象相应成员变量赋值

void get()Object obj)                                获取obj对象相应成员变量

void setAccessible(boolean i)                        

利用Class类获取成员方法

public Method[] getMethods();

public Method[] getDeclaredMethods();

public Method getMethod(String name,Class<?>...parameterTypes)

public Method getDeclaredMethod(String name,Class<?>...parameterTypes)

利用方法名与参数类型定位具体方法 

Method类提供的方法

public Object invoke(Object obj,object...o)        调用obj的相应方法执行

public setAccessible(boolean i) 

注解 Annotation

注解的本质是一个接口,Java中的所有注解都是继承自Annotation接口

我们使用注解,其实就是创建一个实现类对象

自定义注解

public @interface 注解名{

        public 属性类型 属性名() default 默认值;

        ...

}

特殊属性名 value,只有value时,使用注解时可以不写属性名

元注解

元注解就是用于修饰注解的注解 

主要有两个@Target和@Retention

@Target(ElementType.Type)

元注解@Target用于声明被修饰的注解只能在那些位置使用

具体根据枚举ElementType中的常量进行指定

TYPE        类与接口

FIELD        成员变量

METHOD   成员方法

PARAMETER  参数

CONSTRUCTOR  构造方法

LOCAL_VARIABLE  局部变量

@Rentention(RentionPolicy.XXX)

元注解@Rentention用于声明被修饰注解的保留周期

具体根据枚举RentionPolicy的常量进行指定

SOURCE        只在源码阶段,字节码阶段不存

CLASS(默认)        字节码阶段,运行阶段不存在 

RUNTIME        一直保留到运行阶段

 注解解析

使用Java反射技术,获得注解的属性数据的过程,称为注解解析

方法名说明
T getAnnotation(Class annotationClass)根据注解类型获得对应注解对象
Annotation[] getAnnotations()获得当前结构上使用的所有注解
boolean isAnnotationPresent(Class annotationClass)判断当前结构上是否使用了指定的注解,如果使用了则返回true,否则false


Field,Method,Constructor,Class 等反射相关的类可以调用以上方法
通过反射来解析注解,注解在谁头上就用谁来解析

注解在类上,使用Class来获取。
注解在构造方法上,使用Constructor来获取。
注解在成员方法上,使用Method来获取。
注解在成员变量上,使用Field来获取。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.youkuaiyun.com/weixin_50369190/article/details/127513490

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值