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