美文网首页
Java Reflection

Java Reflection

作者: tingshuo123 | 来源:发表于2018-12-05 10:03 被阅读3次

    简介

    Java反射机制是让我们在编译期(Compile Time)之外的运行期(Runtime)检查类,接口,变量以及方法的信息。通过反射还可以在运行期实例化对象,调用方法,获取实例变量,甚至是私有的实例变量。

    小试牛刀

    // 获取类的方法列表
    Method[] methods = Person.class.getMethods();
    for (Method method : methods) {
        System.out.println("method = " + method.getName());
    }
    

    Class 对象

    想要检查一个类的信息,首先得获取到类的 Class 对象。 在 Java 中所有的类型(包括基本类型,数组)都有与之相对应的 Class 对象。 可以通过多种方式获取类的 Class 对象。

    如果在编译期就知道一个类的名字了,你可以通过 .class 获取类的 Class 对象

    Class<Person> perconClass = Person.class;
    

    如果编译器不知到类的名字,但是在运行期间可以获得类全名的字符串,你可以这样

    // 类全名
    String className = "com.project.bean.Person";
    Class<?> personClass = Class.forName(className);
    

    还可以通过对象的实例获取

    Person person = new Person();
    Class<?> personClass = person.getClass();
    

    包信息

    通过 Class 对象获取类的包信息 (Package 对象)

    // 获取包对象
    Package pkg = personClass.getPackage();
    // 通过包对象获取包名
    String packageName = pkg.getName();
    

    获取类名

    通过 Class 对象获取类名

    全限定类名(包名 + 类名)

    personClass.getName()
    

    简单类名(不包含包名)

    personClass.getSimpleName()
    

    修饰符

    通过 Class 对象获取类的修饰符,public, private, static等关键字

    int mod = personClass.getModifiers()
    

    返回的是一个 int 型的数值,它是标识符的标志,可以通过 java.lang.reflect.Modifier 类的 toString(int mod) 方法转换成字符

    String modStr = Modifier.toString(modifiers);
    

    父类 Class 对象

    获取父类的 Class 对象

    Class<?> superClass = personClass.getSuperclass();
    

    实现的接口

    获取实现接口的 Class 对象

    Class<?>[] interfaces = personClass.getInterfaces();
    

    因为一个类可以实现多个接口,所以返回的是一个 Class 数组

    注解

    获取对象的注解信息(Annotation 对象)

    Annotation[] annotations = personClass.getAnnotations();
    

    构造器

    获取 public 修饰的构造器信息

    Constructor<?>[] constructors = personClass.getConstructors();
    

    方法

    通过 Class 对象获取类的方法信息 (Method 对象)

    // 所有 public 修饰的方法信息(包括父类)
    Method[] methods = Person.class.getMethods();
    

    属性

    获取对象的属性信息(Field 对象)

    // 获取该类的所有 public 属性(包括父类)
    Field[] fields = personClass.getFields();
    // 获取该类中定义的所有属性
    Field[] fields = personClass.getDeclaredFields();
    

    构造器 (Constructor 对象)

    我们知道构造器主要是用来创建并初始化一个对象,我们除了通过 new 创建对象,还可以通过 Constructor 来创建一个对象

    
    

    相关文章

      网友评论

          本文标题:Java Reflection

          本文链接:https://www.haomeiwen.com/subject/kshicqtx.html