zoukankan      html  css  js  c++  java
  • 反射常用操作

    定义

    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");//执行方法

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

    参考资料

  • 相关阅读:
    MongoDB权限管理
    Termux结合公网kali打造移动渗透神器
    整人病毒vbs大全!
    mongodb 数据库详解
    mongodb 用户及数据库管理命令
    windows入侵排查思路
    linux 下node.js 安装
    Linux下如何用/proc命令查找进程状态信息——当前目录,内存占用,描述符等
    linux c 得到指定进程内存占用
    1分钟彻底理解C语言指针
  • 原文地址:https://www.cnblogs.com/rb2010/p/12913472.html
Copyright © 2011-2022 走看看