zoukankan      html  css  js  c++  java
  • java--反射机制总结

    一、什么是Java反射机制?

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

    二、反射机制提供了哪些功能?

    • 运行时判定任意一个对象所属的类

    • 运行时构造任意一个类的对象;

    • 运行时判定任意一个类所具有的成员变量和方法;

    • 运行时调用任意一个对象的方法;

    • 生成动态代理;

    三、class对象的获取

        /**
         * 反射机制获取类有三种方法
         */
        @Test
        public void testGetClass() throws ClassNotFoundException {
            Class clazz = null;
     
            //1 直接通过类名.Class的方式得到
            clazz = Person.class;
            System.out.println("通过类名: " + clazz);
     
            //2 通过对象的getClass()方法获取,这个使用的少(一般是传的是Object,不知道是什么类型的时候才用)
            Object obj = new Person();
            clazz = obj.getClass();
            System.out.println("通过getClass(): " + clazz);
     
            //3 通过全类名获取,用的比较多,但可能抛出ClassNotFoundException异常
            clazz = Class.forName("com.java.reflection.Person");
            System.out.println("通过全类名获取: " + clazz);
        }

    四、反射机制能够获取哪些信息?Class类的API详解。

     1. 利用newInstance创建对象:调用的类必须有无参的构造器

      1.1 通过字节码对象创建实例对象(无参构造方法)

      

      1.2 有参构造方法创建对象

      

      总结上面创建实例对象:Class类的newInstance()方法是使用该类无参的构造函数创建对象;如果一个类没有无参的构造函数, 就不能这样创建了,可以调用Class类的getConstructor(String.class,int.class)方法获取一个指定的构造函数然后再调用Constructor类的newInstance("张三",20)方法创建对象获取全部构造方法;

      

    2. 获取类成员变量并使用--Field对象

      2.1 获取指定成员变量

      

      Class.getField(String)方法可以获取类中的指定字段(可见的), 如果是私有的可以用getDeclaedField("name")方法获取,通过set(obj, "李四")方法可以设置指定对象上该字段的值, 如果是私有的需要先调用setAccessible(true)设置访问权限,用获取的指定的字段调用get(obj)可以获取指定对象中该字段的值

      2.2 获取全部成员变量

      

    3. 获得方法并使用--Method对象

      3.1 获取指定方法

      

      Class.getMethod(String, Class...) 和 Class.getDeclaredMethod(String, Class...)方法可以获取类中的指定方法,如果为私有方法,则需要打开一个权限。setAccessible(true);用invoke(Object, Object...)可以调用该方法,

      3.2 一次性获得所有的方法

      

    五、class的摘要信息

    boolean isPrimitive = class1.isPrimitive();//判断是否是基础类型
    boolean isArray = class1.isArray();//判断是否是集合类
    boolean isAnnotation = class1.isAnnotation();//判断是否是注解类
    boolean isInterface = class1.isInterface();//判断是否是接口类
    boolean isEnum = class1.isEnum();//判断是否是枚举类
    boolean isAnonymousClass = class1.isAnonymousClass();//判断是否是匿名内部类
    boolean isAnnotationPresent = class1.isAnnotationPresent(Deprecated.class);//判断是否被某个注解类修饰
    
    String className = class1.getName();//获取class名字 包含包名路径
    Package aPackage = class1.getPackage();//获取class的包信息
    String simpleName = class1.getSimpleName();//获取class类名
    int modifiers = class1.getModifiers();//获取class访问权限
    
    Class<?>[] declaredClasses = class1.getDeclaredClasses();//内部类
    Class<?> declaringClass = class1.getDeclaringClass();//外部类
    
    Annotation[] annotations = class1.getAnnotations();//获取class对象的所有注解
    Annotation annotation = class1.getAnnotation(Deprecated.class);//获取class对象指定注解
    
    Type genericSuperclass = class1.getGenericSuperclass();//获取class对象的直接超类的 Type
    Type[] interfaceTypes = class1.getGenericInterfaces();//获取class对象的所有接口的type集合

    反射机制的优缺点:

    优点:运行期类型的判断,动态类加载,动态代理使用反射。

    缺点:性能是一个问题,反射相当于一系列解释操作,通知jvm要做的事情,性能比直接的java代码要慢很多。

    总结:Java的反射机制在平时的业务开发过程中很少使用到,但是在一些基础框架的搭建上应用非常广泛,今天简单的总结学习了一下,还有很多未知的知识等以后用到再做补充。

  • 相关阅读:
    封装一个php语言的api提示类
    Content-Type四种常见取值
    postman中 form-data、x-www-form-urlencoded、raw、binary的区别
    ansible find
    Linux系统中根目录下或者新挂载的磁盘目录下有一个叫lost+found,它的作用是什么?
    rm /mv需要注意的
    mount
    es number_of_shards和number_of_replicas
    logstash设置配置路径
    ES7.8 设置 xpack
  • 原文地址:https://www.cnblogs.com/TvvT-kevin/p/9863935.html
Copyright © 2011-2022 走看看