• 反射常用操作


    定义

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

    用途

    在日常的第三方应用开发过程中,经常会遇到某个类的某个成员变量、方法或是属性是私有的或是只对系统应用开放,这时候就可以利用Java的反射机制通过反射来获取所需的私有成员或是方法。

    常见应用场景:

    自定义注解,通过自定义注解添加权限、日志等功能

    注意:反射要少用,因为反射破环了封装,效率比较低。

    =================================================================

    一、先创建一个model类,便于测试

    package com.sh.demo.model;
    
    import lombok.Data;
    import org.springframework.stereotype.Repository;
    
    @Data
    @Repository
    public class User {
    
        public User() {
        }
        private int id;
        private String name;
        public String pubVal;
        private User(String pubVal){
            this.pubVal=pubVal;
        }
        public User(String pubVal,String name){
            this.pubVal=pubVal;
        }
        private String method(String str){
            System.out.println(str);
            return str;
        }
    
    }

    二、获得Class方式

         Class aClass = new User().getClass();
            aClass = Class.forName("com.sh.demo.model.User");
            aClass=ClassLoader.getSystemClassLoader().loadClass("com.sh.demo.model.User");

    三、获得属性

         Field[] fields = aClass.getFields();//获得对象中所有public的属性
            Field[] declaredFields = aClass.getDeclaredFields();//获得对象中所有属性
            Field id = aClass.getField("pubVal");//获得对象中指定public的属性

    四、获得方法

         Method[] methods = aClass.getMethods();//获得对象中所有public的方法
            Method[] declaredMethods = aClass.getDeclaredMethods();//获得对象中所有的方法
            Method setId = aClass.getMethod("setId", int.class);//获得对象中指定public的方法

    五、获得构造函数

         Constructor<?>[] constructors = aClass.getConstructors();//获得对象中所有public的构造函数
            Constructor<?>[] constructors_all = aClass.getDeclaredConstructors();//获得对象中所有的构造函数
            Constructor<?> declaredConstructor = aClass.getDeclaredConstructor(String.class);//获得private的对应参数的构造函数
            Constructor<?> constructor = aClass.getConstructor(String.class,String.class);//获得public的对应参数的构造函数

    六、Class常用方法

            aClass = Class.forName("com.sh.demo.controller.People");
            Class superclass = aClass.getSuperclass();//获得当前类继承的父类的名字
            Class[] interfaces = aClass.getInterfaces();//获得当前类实现的类或是接口

    七、获得方法上的注解

            for (Method declaredMethod : declaredMethods) {
                Annotation[] declaredAnnotations = declaredMethod.getAnnotations();//获得所有public方法上的注解
                Bean annotation = declaredMethod.getAnnotation(Bean.class);//获得指定方法上的指定注解
            }

    八、执行方法

    Method method = aClass.getMethod("method", String.class);//获得类中方法
    Object obj = aClass.newInstance();//根据传递的参数创建类的对象
    method.setAccessible(false);//设置false就可以调用private的方法,否则只能调用public的,设置false反射效率能提高3-4倍
    String str = (String) method.invoke(obj, "strtest");//执行方法

    附我工作中使用过的自定义注解

    参考资料

  • 相关阅读:
    iOS App之间跳转
    iOS 编码转换
    iOS文件类型判断
    iOS 运行时
    libqrencode生成二维码
    设置app的启动图
    根据字体计算CGRect
    iOS 英文学习
    libev 中IO事件循环解析
    libev 默认事件循环初始化的解析
  • 原文地址:https://www.cnblogs.com/rb2010/p/12913472.html
Copyright © 2020-2023  润新知