• 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html
  • 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html

带你走进Java反射机制的世界

技术杂谈 勤劳的小蚂蚁 4个月前 (12-16) 110次浏览 已收录 0个评论 扫描二维码

在 Java中,反射机制(Reflection)非常重要,但对于很多开发者来说,这并不容易理解,甚至觉得有点神秘。今天我们就来了解一下Java的反射机制吧!

什么是Java的反射

JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

总而言之,在JAVA中,只有给定类的名字,就可以通过反射机制来获取类的所有信息,可以动态的创建对象和编译。

Java反射的原理

JAVA语言编译之后会生成一个.class文件,反射就是通过字节码文件找到某一个类、类中的方法以及属性等。

反射的实现主要借助以下四个类:

Class:类的对象

Constructor:类的构造方法

Field:类中的属性对象

Method:类中的方法对象

获取类对象

Class.forName(String clazzName)静态方法

调用类的class属性,Person.class返回的就是Person的class对象(推荐使用)

调用某个对象的getClass()方法

具体使用还是要根据实际来选择,第一种方式是比较自由的,只要知道一个类名就可以了,其不会做该类是否存在的校验,第二种、第三种则会做校验。

获取类的信息

获取类构造器

ConnstructorgetConstructor(Class…parameterTypes):返回此Class对象对应类的带指定形参的public构造器

Constructor[] getConstructors():返回此Class对象对应类的所有public构造器

Constructor[] getDeclaredConstructor(Class…parameterTypes):返回此class对象对应类的带指定参数的构造器,与构造器的访问权限无关

Constructor[] getDeclaredConstructors():返回此class对象对应类的所有构造器,与构造器的访问权限无关

获取类成员方法

Method getMethod(String name,Class…parameterTypes):返回此class对象对应类的带指定形参的public方法

Method[] getMethods():返回此class对象所表示的类的所有public方法

Method getDeclaredMethod(string name,Class…parameterTypes):返回此class对象对应类的带指定形参的方法,与方法访问权限无关

Method[] getDeclaredMethods():返回此class对象对应类的全部方法,与方法的访问权限无关

获取类成员变量

Field getField(String name):返回此class对象对应类的指定名称的public成员变量

Field[] getFields():返回此class对象对应类的所有public成员变量

Field getDeclaredField(String name):返回此class对象对应类的指定名称的成员变量,与成员变量访问权限无关

Field[] getDeclaredFields():返回此class对象对应类的全部成员变量,与成员变量的访问权限无关

获取类注解

AgetAnnotation(ClassannotationClass):尝试获取该class对象对应类上村子的指定类型的Annotation,如果该类型注解不存在,则返回null

AgetDeclaredAnnotation(ClassannotationClass):这是Java 8中新增的,该方法获取直接修饰该class对象对应类的指定类型的Annotation,如果不存在,则返回null

Annotation[] getAnnotations():返回修饰该class对象对应类上存在的所有Annotation

Annotation[] getDeclaredAnnotations():返回修饰该Class对象对应类上存在的所有Annotation

A[]getAnnotationByType(ClassannotationClass):该方法的功能与前面介绍的getAnnotation()方法基本相似,但由于Java8增加了重复注解功能,因此需要使用该方法获取修饰该类的指定类型的多个Annotation

A[]getDeclaredAnnotationByType(ClassannotationClass):该方法发功能与前面介绍的getDeclaredAnnotations()方法相似,也是因为Java8的重复注解的功能,需要使用该方法获取直接修饰该类的指定类型的多个Annotation

获取该类内部类

Class[] getDeclaredClasses():返回该class队形对应类里包含的全部内部类

获取该类对象所在的外部类

Class getDeclaringClass():返回该Class对象对应类所在的外部类

获取该类对象对应类所实现的接口

Class[] getInterfaces():返回该Class对象对应类所实现的全部接口

获取该类对象对应类所继承的父类

Class getSuperclass():返回该Class对象对应类的超类的Class对象

获取该类对象对应类的修饰符等信息

int getModifiers():返回此类或接口的所有修饰符,修饰符由public、protected、private、final、static、abstract等对应的常量组成,返回的整数应使用Modifier工具类的方法来解码,才可以获取真是的修饰符

Package getPackage():获取该类的包

String getName():以字符串形式返回此CLass对象所表示的类的简称

判断该类是否为接口、枚举、注解类型

boolean isAnnotation():返回此class对象是否表示一个注解类型

boolean isAnnotationPresent(ClassannotationClass):判断此Class对象是否使用类Annotation修饰

boolean isAnonymousClass():返回此class对象是否是一个匿名类

boolean isArray():返回此class对象是否表示一个数组类

boolean isEnum():返回此class对象是否表示一个枚举

boolean isInterface():返回此class对象是否表示一个接口

boolean isInstance(Object obj):判断obj是否是此class对象的实例,该方法可以完全代替instanceof操作符

public interface Colorable {

     public void value();

}

public class ClassInfo {

    public static void main(String[] args) throws NoSuchMethodException, SecurityException {

        Classcls=Colorable.class;

        System.out.println(cls.getMethod(“value”));

        System.out.println(cls.isAnnotation());

        System.out.println(cls.isInterface());

    }

}

结果

public abstract void com.em.Colorable.value()

false

true


丨极客文库, 版权所有丨如未注明 , 均为原创丨
本网站采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行授权
转载请注明原文链接:带你走进Java反射机制的世界
喜欢 (0)
[247507792@qq.com]
分享 (0)
勤劳的小蚂蚁
关于作者:
温馨提示:本文来源于网络,转载文章皆标明了出处,如果您发现侵权文章,请及时向站长反馈删除。

您必须 登录 才能发表评论!

  • 精品技术教程
  • 编程资源分享
  • 问答交流社区
  • 极客文库知识库

客服QQ


QQ:2248886839


工作时间:09:00-23:00