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
  • 相关阅读:
    二分+RMQ/双端队列/尺取法 HDOJ 5289 Assignment
    思维题 HDOJ 5288 OO’s Sequence
    树形DP Codeforces Round #135 (Div. 2) D. Choosing Capital for Treeland
    最大流增广路(KM算法) HDOJ 1853 Cyclic Tour
    最大流增广路(KM算法) HDOJ 1533 Going Home
    最大流增广路(KM算法) HDOJ 2255 奔小康赚大钱
    Complete the Word CodeForces
    Gadgets for dollars and pounds CodeForces
    Vasya and Basketball CodeForces
    Carries SCU
  • 原文地址:https://www.cnblogs.com/xie-qi/p/13040802.html
Copyright © 2011-2022 走看看