栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

源码必备技能,反射

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

源码必备技能,反射

类的加载过程

​ Class类的实例表示正在运行的Java应用程序中的类和接口,每个类只会产生一个Class对象,在类加载的时候自动创建
当用户想要获取任何一个Class类有三种方式:
​ 1、Object→getClass()
​ Class clazz = new Emp().getClass();
​ 2、任何数据类型都有一个静态的class属性
​ Class clazz = Emp.class;
​ 3、通过Class.forName()
​ Class clazz = Class.forName(“com.mashibing.entity.Emp”);
​ 4、如果是基本数据类型,可以通过TYPE的方式来获取Class对象

        //1、通过class.forname()来获取Class对象
//        Class clazz = Class.forName("com.mashibing.entity.Emp");
//        System.out.println(clazz.getPackage());
//        System.out.println(clazz.getName());
//        System.out.println(clazz.getSimpleName());
//        System.out.println(clazz.getCanonicalName());
        //2、通过类名.class来获取
//        Class clazz = Emp.class;
//        System.out.println(clazz.getPackage());
//        System.out.println(clazz.getName());
//        System.out.println(clazz.getSimpleName());
//        System.out.println(clazz.getCanonicalName());
        //3/通过对象的getClass来获取,不推荐使用
//        Class clazz = new Emp().getClass();
//        System.out.println(clazz.getPackage());
//        System.out.println(clazz.getName());
//        System.out.println(clazz.getSimpleName());
//        System.out.println(clazz.getCanonicalName());

        //4.如果是一个基本数据类型,那么可以通过TYPE的方式来获取Class对象
        Class type = Integer.TYPE;
        System.out.println(type.getName());
        System.out.println(type.getCanonicalName());

三种方式的对比:

​ 1、第一种已经创建对象,就意味着已经产生了Class类
​ 2、第二种需要导入对应的包,依赖太强
​ 3、第三种常用,只需要传入一个类的完全限定名即可

Class的常用方法:

​ Object newInstance():用于操作对应的类
​ Field getFields():获取成员变量,包括子类及父类,同时只能包含公共的方法
​ Field[] getField(String name):通过属性名来获取公共属性
​ Field getDeclaredFields():此方法返回的是当前类的所有属性,不仅仅局限于公共访问修饰符,所有的访问修饰符都可以拿到
​ Field[] getDeclaredField(String name):通过属性名来获取所有属性
​ Field的属性:
​ getName():返回属性名字
​ getType():返回属性名字
​ Set(Object obj, Object value):设置该属性的值
​ setAccessible(Boolean boolean):如果访问修饰符是私有的,设置属性是否允许被访问
​ int getModifiers()返回属性的类型,对应的int值
​ Method getMethod(String name, Class… parameterTypes):根据名字和参数类型的class对象获取方法
​ Method[] getMethods():获取该对象的普通方法
​ Method getDeclaredMethod(String name, Class… parameterTypes):根据名字和参数类型的class对象获取方法
​ Method[] getDeclaredMethods():获取所有方法的
​ Method的属性:
​ setAccessible(Boolean boolean):如果访问修饰符是私有的,设置属性是否允许被访问
​ invoke(Object obj, Object… args);调用该方法,并传入参数与class对象的Object newInstance():用于操作对应的类
​ Constructor[] getDeclaredConstructors():获取普通的构造方法
​ Constructor getDeclaredConstructor(Class… parameterTypes):获取所有的构造器,包括私有的和公有的
​ Constructor属性
​ setAccessible(Boolean boolean):如果访问修饰符是私有的,设置属性是否允许被访问
​ newInstance(Object … initargs):传入要调用构造器的函数,并且执行方法

//获取成员变量,包括子类及父类,同时只能包含公共的方法

  Class clazz = Class.forName("com.mashibing.reflect.Student");
        
        ​        Field[] fields = clazz.getFields();
        ​        Field className = clazz.getField("className");
        ​        Object o4 = clazz.newInstance();
        ​        className.setAccessible(false);
        ​        className.set(o4,"张三");
        ​        System.out.println(((Student)o4).className);
        ​        for (Field field : fields) {
            System.out.println(field);
            System.out.println(field.getName());
            System.out.println(field.getType());
            System.out.println(field.getModifiers());
            System.out.println("--------");
        ​        }
        ​        System.out.println("==============");
        ​        //此方法返回的是当前类的所有属性,不仅仅局限于公共访问修饰符,所有的访问修饰符都可以拿到
        ​        Field[] declaredFields = clazz.getDeclaredFields();
        ​        declaredFields[1].setAccessible(true);
        ​        Object o1 = clazz.newInstance();
        ​        declaredFields[1].set(o1,"上海");
        ​        System.out.println(((Student)o1).getAddress());
    for (Field field : declaredFields) {
        System.out.println(field);
        System.out.println(field.getName());
        System.out.println(field.getType());
        System.out.println(field.getModifiers());
        System.out.println("--------");
    }

    System.out.println("LLLLLLLLLLLLLLLLLLLLLLLLLLLLL");
    //反射在一定程度上破坏了封装行,需要合理使用
    Field addres = clazz.getDeclaredField("address");
    System.out.println(addres.getName());
    System.out.println(addres.getType());
    System.out.println(addres.getModifiers());
    //设置该属性是否能被访问,ture表示能被访问,破坏了封装性
    addres.setAccessible(true);
    Object o = clazz.newInstance();
    addres.set(o,"北京");
    System.out.println(((Student)o).getAddress());

    System.out.println("方法====================");
    //获取该对象的普通方法,包含的方法范围是当前对象及父类对象的所有公共方法
    Method[] methods = clazz.getMethods();
    for (Method method : methods) {
        System.out.println(method);
        System.out.println(method.getName());
        System.out.println(method.getModifiers());
    }
    System.out.println("+++++++++++++++++++++");
    //获取当前类中所有的方法,无论什么访问修饰符
    Method[] declaredMethod = clazz.getDeclaredMethods();
    for (Method method : declaredMethod) {
        System.out.println(method.getName());
        System.out.println(method.getReturnType());
    }
    Method add = clazz.getDeclaredMethod("add", int.class, int.class);
    Object o2 = clazz.newInstance();
    add.setAccessible(true);
    add.invoke(o2,123,123);


    System.out.println("++++++++++++++++++++++");
    //获取对象的所有构造方法,只能获取公有的构造方法
    Constructor[] constructors = clazz.getConstructors();
    for (Constructor constructor : constructors) {
        System.out.println(constructor.getName());
    }
    //获取所有的构造方法,无论是私有或者是公有
    Constructor[] declaredConstructors = clazz.getDeclaredConstructors();
    for (Constructor declaredConstructor : declaredConstructors) {
        System.out.println(declaredConstructor.getName());
    }
    //如何调用私有的构造方法
    Constructor declaredConstructor = clazz.getDeclaredConstructor(String.class, int.class, String.class);
    declaredConstructor.setAccessible(true);
    Student o3 = (Student)declaredConstructor.newInstance("msb", 44, "java");
    System.out.println(o3);

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/685273.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号