美文网首页
Java高级特性-反射

Java高级特性-反射

作者: 静智 | 来源:发表于2022-04-03 20:10 被阅读0次

前言

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

应用场景

Android中最熟悉的反射,莫过于Json数据的转换,例如网络数据,数据库数据和类之间的相互转化。使用反射机制可以直接创建对象,方便代码管理。

相关类

. Class

  • class类下部分常用方法
方法名 翻译
forName(String className) 加载参数指定的类,并且初始化它。
cast 对象转换成代表类或是接口的对象
getClasses() 返回一个数组,数组中包含该类中所有公共类和接口类的对象
getName() 获取类路径名称
newInstance 创建类的实例
getPackage() 获取类所在包
getInterfaces() 确定此对象所表示的类或接口实现的接口
getSuperclass() 获得当前类继承的父类的名字
getClassLoader() 获取类加载器
getDeclaredClasses() 返回一个数组,数组中包含该类中所有类和接口类的对象
  • Class类下相关属性方法
方法名 翻译
getField(String name) 获取某个公有的属性对象
getFields() 获取所有公有的属性对象
getDeclaredField(String name)) 获取某个私有属性对象
getDeclaredFields() 获取所有私有属性对象
  • Class 类下相关注解方法
方法名 翻译
getDeclaredAnnotations() 返回对应类下所有注解对象
getDeclaredAnnotation(Class<A> annotationClass) 返回对应类中与参数类型匹配的所有注解对象
getAnnotation(Class<A> annotationClass) 返回对应类中与参数类型匹配的公有注解对象
getAnnotations () 返回对应类中所有公有注解对象
  • Class 类下其它相关方法
方法名 翻译
getMethods() 返回该类所有公有的方法
getMethod (String name, Class...<?> parameterTypes) 返回该类某个公有方法
getDeclaredMethod(String name, Class...<?> parameterTypes) 返回该类某个方法
getDeclaredMethods() 返回该类所有方法

. Method

  • Method类下部分常用方法
方法名 翻译
invoke(Object obj, Object... args) 传递object对象及参数调用该对象对应的方法

. Field

  • Field类下部分常用方法
方法名 翻译
get(Object obj) 获得obj中对应的属性值
set(Object obj, Object value) 设置obj中对应属性值

. Constructor

  • Constructor类下部分常用方法
方法名 翻译
newInstance(Object... initargs) 根据传递的参数创建类的对象

示例

  • 反射实体类
public class GloryOfKings {

    private String role;
    private String skills;
    private String explain;

    public GloryOfKings() {
    }

    private GloryOfKings(String role, String skills) {
        this.role = role;
        this.skills = skills;
    }

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }

    public String getSkills() {
        return skills;
    }

    public void setSkills(String skills) {
        this.skills = skills;
    }

    public void setExplain(String explain) {
        this.explain = explain;
    }

    public String getExplain() {
        return explain;
    }

    private String week(int flag) {
        String string = "";
        switch (flag) {
            case FlagMethod.monday:
                string = "天气晴朗";
                break;
            case FlagMethod.tuesday:
                string = "多云";
                break;
            case FlagMethod.Wednesday:
                string = "微风";
                break;
            case FlagMethod.Thursday:
                string = "阵风6级";
                break;
            case FlagMethod.Friday:
                string = "中雨";
                break;
            case FlagMethod.Saturday:
                string = "大雨";
                break;
            case FlagMethod.Sunday:
                string = "晴朗";
                break;
            default:
                string = "-.-";
        }

        return string;
    }
}

  • 逻辑封装类
public class Reflect {
    /**
     * 反射-创建对象(三种方式:.class、new MyClass().getClass,Class.forName("类的全路径"))
     */
    public static void newInstance(int flag) {
        String outMessage = "";
        try {
            switch (flag) {
                case FlagSource.newInstanceOne:
                    Class<GloryOfKings> cls = GloryOfKings.class;
                    GloryOfKings gloryOfKings = cls.newInstance();
                    gloryOfKings.setExplain("创建对象方式- GloryOfKings.class");
                    gloryOfKings.setRole("李元芳");
                    gloryOfKings.setSkills("利刃风暴");
                    outMessage = gloryOfKings.toString();
                    break;
                case FlagSource.newInstanceTwo:
                    Class<? extends GloryOfKings> cls1 = new GloryOfKings().getClass();
                    GloryOfKings gloryOfKings1 = cls1.newInstance();
                    gloryOfKings1.setExplain("创建对象方式- new GloryOfKings().getClass()");
                    gloryOfKings1.setRole("后羿");
                    gloryOfKings1.setSkills("灼日之矢”");
                    outMessage = gloryOfKings1.toString();
                    break;
                case FlagSource.newInstanceThree:
                    Class<?> cls2 = Class.forName("com.linked.business.reflect.GloryOfKings");
                    GloryOfKings gloryOfKings2 = (GloryOfKings) cls2.newInstance();
                    gloryOfKings2.setExplain("创建对象方式- Class.forName()");
                    gloryOfKings2.setRole("诸葛亮");
                    gloryOfKings2.setSkills("时空穿梭”");
                    outMessage = gloryOfKings2.toString();
                    break;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(outMessage);
    }

    /**
     * 反射-私有构造方法
     */
    public static void construction() {
        try {
            Class<?> cls = Class.forName("com.linked.business.reflect.GloryOfKings");
            Constructor<?> constructor = cls.getDeclaredConstructor(String.class, String.class);
            constructor.setAccessible(true);
            Object obj = constructor.newInstance(" 反射-设置私有构造方法:名称", " 反射-获取私有构造方法:福利");
            GloryOfKings go = (GloryOfKings) obj;
            System.out.println("反射-获取私有构造方法" + go);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 反射-私有属性
     */
    public static void reflectDeclaredAttribute() {
        try {
            Class<?> cls = Class.forName("com.linked.business.reflect.GloryOfKings");
            Object obj = cls.newInstance();
            Field field = cls.getDeclaredField("TAG");
            field.setAccessible(true);
            String str = (String) field.get(obj);
            System.out.println("反射-获取私有属性" + str);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 反射-私有方法
     * <p>将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查;
     * 实际上setAccessible是启用和禁用访问安全检查的开关,并不是为true就能访问为false就不能访问 ;
     * 由于JDK的安全检查耗时较多.所以通过setAccessible(true)的方式关闭安全检查就可以达到提升反射速度的目的
     * </p>
     */
    public static void privateMethod() {
        try {
            Class<?> cls = Class.forName("com.linked.business.reflect.GloryOfKings");
            Method method = cls.getDeclaredMethod("week", int.class);
            method.setAccessible(true);
            Object obj = cls.newInstance();
            //invoke:传递object对象及参数调用该对象对应的方法
            String str = (String) method.invoke(obj, FlagMethod.monday);
            System.out.println(str);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  • 测试类
public class ReflectTest {
    public static void main(String[] args) {
        try {
            Reflect.newInstance(FlagSource.newInstanceTwo);
            Reflect.attribute();
            Reflect.construction();
            Reflect.privateMethod();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

参考链接:https://www.jianshu.com/p/9be58ee20dee

相关文章

  • java反射学习笔记(一)——反射概述

    [TOC] 反射是什么? 反射(Reflaction in action )是java的高级特性,反射机制是指...

  • Android之反射机制与JSON解析

    1 反射机制&JSON解析 【 Java的高级特性:反射机制 publicclass Student { pu...

  • Java高级特性——反射

    概述 定义 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都...

  • Java高级特性——反射

    一、什么是反射? JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对...

  • Java高级特性——反射

    一. 定义及优缺点 JAVA反射机制:是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一...

  • Java高级特性---反射

    定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够...

  • Java高级特性-反射

    前言 JAVA反射机制[https://baike.baidu.com/item/JAVA%E5%8F%8D%E5...

  • 这才是理解Java反射的正确姿势

    反射简介 反射是Java的高级特性之一,但是在实际的开发中,使用Java反射的案例却非常的少,但是反射确实在底层框...

  • 学过框架的必看—Java反射

    反射作为 Java 的高级特性,很多框架中都用到了反射的知识,如 Spring,Hibernate等,通过配置就可...

  • Java高级特性之反射

    定义 JAVA反射机制[https://baike.baidu.com/item/JAVA%E5%8F%8D%E5...

网友评论

      本文标题:Java高级特性-反射

      本文链接:https://www.haomeiwen.com/subject/jptbjrtx.html