zoukankan      html  css  js  c++  java
  • java反射

    在java程序运行状态中,对于任意一个类,可以获取其所有的属性和方法,对于任意一个对象可以动态的调用其方法获取其属性。我们称这种特性为java反射。

    应用:

    在程序运行过程中,动态实现以下操作:

    1)通过反射创建对象

         a. Class.newInstance()

         b. Construction.newInstance()

            //通过反射创建对象
            //1、通过newInstance创建对象,调用无参构造
            Student student=studentClass.newInstance();
            //2、通过构造器创建对象
            Constructor<Student> constructor = studentClass.getDeclaredConstructor();
            //设置是否允许访问,当private方法设置为true后,可以直接调用
            constructor.setAccessible(true);
            //通过构造器调用对象
            Student student1 = constructor.newInstance();
            Student student2 = constructor.newInstance();
            System.out.println(student1==student2);//false

    2)通过反射获取对象的类型,属性,方法,构造

     /**
         * 演示获取类的各种信息
         */
        public static void getClassInfo() throws NoSuchFieldException {
            Class<Student> studentClass = Student.class;
            //获取类上的注解
            Annotation[] annotations=studentClass.getAnnotations();
            //根据名称获取单个属性
            Field name=studentClass.getField("name");
            name.setAccessible(true);
            LogData annotation = name.getAnnotation(LogData.class);
            Field[] fields = studentClass.getFields();//获取类中的public属性
            Field[] declaredFields = studentClass.getDeclaredFields();//获取类中定义的所有属性
            //获取类的方法
            Method[] methods = studentClass.getMethods();//获取类中的public的方法(包含父类方法)
            Method[] declaredMethods = studentClass.getDeclaredMethods();//获取类中定义的所有方法
            //获取实现的接口
            Class<?>[] interfaces = studentClass.getInterfaces();
            //获取类的父类
            Class<? super Student> superclass = studentClass.getSuperclass();
            //包含包名的类名
            String name1 = studentClass.getName();
            //不包含包名的类名
            String simpleName = studentClass.getSimpleName();
        }

    3)动态调用对象的方法,获取对象的属性

    4)获取方法或属性上的注解信息

    反射中涉及到的常用类

    1)    Class类:用来描述类信息的类

    2)    Method类:用来描述方法的类

    3)    Field类:用来描述属性的类

    4)    Construction类:用来描述构造方法

    获取Class对象的方式

    1) 类名.class

    2) 对象.getClass();

    3) Class.forName(“类的全路径”)

            //获取class对象,一个类只有一个Class对象
            Class<Student> studentClass=Student.class;
            Class<? extends Student> aClass=new Student().getClass();
            Class<?> aClass1=Class.forName("entity.Student");
            System.out.println(studentClass==aClass);//true
            System.out.println(studentClass==aClass1);//true
  • 相关阅读:
    雅礼集训2017day5乱写
    任意值域最长公共子序列问题
    雅礼集训2017day4乱写
    雅礼集训2017day2乱写
    SP839
    雅礼集训2017day1乱写
    CF671E
    仅维护当前区间影响类问题的线段树
    「雅礼集训 2017 Day4」编码
    Codeforces Round #503 Div. 2
  • 原文地址:https://www.cnblogs.com/xie-qi/p/13040802.html
Copyright © 2011-2022 走看看