• 原来你是这样的JAVA[06]-反射


    1.JVM为每个加载的class及interface创建了对应的Class实例来保存class及interface的所有信息;
    获取一个class对应的Class实例后,就可以获取该class的所有信息;
    通过Class实例获取class信息的方法称为反射(Reflection);
    JVM总是动态加载class,可以在运行期根据条件来控制加载class。

    2.Java的反射API主要用于在运行过程中动态生成类、接口或对象等信息,其常用API如下。

    • Class类:用于获取类的属性、方法等信息。
    • Field类:表示类的成员变量,用于获取和设置类中的属性值。
    • Method类:表示类的方法,用于获取方法的描述信息或者执行某个方法。
    • Constructor类:表示类的构造方法。
    public class ReflectTest {
        public static void main(String[] args) {
            Class class1 = String.class;
            printClassInfo(class1);
    
            Class cls2 = "hello".getClass();
            printClassInfo(cls2);
    
            Class cls3 = String[].class;
            printClassInfo(cls3);
    
            //true,指向同一个实例
            System.out.println("class1 == cls2? "+(class1 == cls2));
        }
    
        private static void printClassInfo(Class c) {
            System.out.println("getName()=" + c.getName());
            System.out.println("getSimpleName()=" + c.getSimpleName());
            System.out.println("isInterface()=" + c.isInterface());
            System.out.println("isEnum()=" + c.isEnum());
            System.out.println("isArray()=" + c.isArray());
            System.out.println("isPrimitive=" + c.isPrimitive());
        }
    }
    

    3.Class类提供了以下几个方法来获取字段:

    • Field getField(name):根据字段名获取某个public的field(包括父类)
    • Field getDeclaredField(name):根据字段名获取当前类的某个field(不包括父类)
    • Field[] getFields():获取所有public的field(包括父类)
    • Field[] getDeclaredFields():获取当前类的所有field(不包括父类)
    • Field.setAccessible:成员变量为private,必须进行此操作。
    class Student extends Person {
        public int score;
        private int grade;
    }
    
    class Person {
        public String name;
    }
    

    首先尝试访问共有和私有变量:

    private static void method() throws NoSuchFieldException {
            Class cls = Student.class;
            System.out.println(cls.getField("score"));
            System.out.println(cls.getDeclaredField("score"));
            //获取私有方法报错
    //        System.out.println(cls.getField("grade"));
            System.out.println(cls.getDeclaredField("grade"));
        }
    

    使用setAccessible,访问私有成员变量:

    private static void privateField() throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
            Class cls = Class.forName("com.cathyjava.j2se.reflect.Student");
            Student student = (Student) cls.getDeclaredConstructor().newInstance();
            Field field = cls.getDeclaredField("grade");
            field.setAccessible(true);
            field.set(student, 2);
        }
    

    作者:陈敬(Cathy)
    出处:http://www.cnblogs.com/janes/
    博客文章仅供交流学习,请勿用于商业用途。如需转载,请务必注明出处。

  • 相关阅读:
    github提交忽略idea
    快速上手 Python 命令行模块 Click
    Clean Python第四章元类部分 4-15演示代码修正
    Python Type Hint类型注解
    docker运行python3.8
    python3 aes加解密代码(PCKS7,CBC模式,Base64结果)
    从源代码分析Universal-Image-Loader中的线程池
    从源代码分析Android-Universal-Image-Loader的缓存处理机制
    从源代码分析Android-Universal-Image-Loader图片下载技巧
    【译】UNIVERSAL IMAGE LOADER.PART 2---ImageLoaderConfiguration详解
  • 原文地址:https://www.cnblogs.com/janes/p/14603333.html
Copyright © 2020-2023  润新知