温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java反射如何使用

发布时间:2021-11-09 15:06:34 来源:亿速云 阅读:323 作者:小新 栏目:开发技术

这篇文章将为大家详细讲解有关Java反射如何使用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

    反射

    相信刚接触Java的,第一句肯定会问什么是反射呢?反射有什么作用呢?为什么使用反射呢?首先反射是Java的特征之一,项目中Java程序在运行的过程中,自动去识别并创建对应的类,能够动态的调用类的属性、构造方法、类中的方法。一句话描述:在程序中能动态调用不同的类和属性,去执行特定的操作。

    正因为反射能够在运行时动态加载需要的对象,所以很多框架中都使用到了反射。本次为了大家很好的理解反射,将基于反射创建对象、获取反射中的对象、获取类中属性、获取类中的构造方法、获取类中方法几个方面进行介绍,下面开始进入正题。

    基础数据准备

    为了方便演示,创建了一个基础的对象类。并基于他进行本次的介绍。创建的演示类JueJinUser如下,包含四个属性,分别有get和set方法,还有toString方法,没有创建构造方法,下面会介绍通过反射自动创建的相关反射的方法。

    public class JueJinUser {
        private Integer id;
    
        private String name;
    
        private String title;
    
        private Integer age;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getTitle() {
            return title;
        }
    
        public void setTitle(String title) {
            this.title = title;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "JueJinUser{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    ", title='" + title + '\'' +
                    ", age=" + age +
                    '}';
        }
    }

    基于反射创建对象

    基于反射创建类对象主要有两种方式:第一种是通过类对象的newInstance()方法创建对象,第二种是通过构造器中的 newInstance()方法创建对象。

    类对象的newInstance()方法

      类对象的newInstance()方法创建方法如下:

       Class class = JueJinUser.class;
           JueJinUser jueJinUseByClass = (JueJinUser) class.newInstance();

    构造器的newInstance()方法

    Class jueJinUserClass = JueJinUser.class;
            Constructor constructor = jueJinUserClass.getConstructor();
            JueJinUser jueJinUserByConstructor = (JueJinUser) constructor.newInstance();

    需要注意的是,两种创建方式中第一种基于类对象的newInstance()的方法只能是无参构造方法,而第二种基于构造器的 newInstance()方法可以有有参构造方法和无参构造方法,比较灵活。

    获取反射中的对象

    获取反射对象的方式有三种,分别是:Class.forName、.class 方法和getClass() 方法。获取反射中对象的方法大家在项目中使用的还是比较多的,相信大家都不陌生。

    Class.forName

    Class clzForName = Class.forName("com.example.demo.module.JueJinUser");

    .class 方法

    Class clzForClass =JueJinUserString.class;

    getClass() 方法

    JueJinUser JueJinUser = new JueJinUser();
        Class clzNewObject = str.getClass();

    获取类中属性

    通过getFields和getDeclaredFields的方法,可以获取类中的属性信息,其中getFields可以获取类中的公有属性值,而getDeclaredFields的方法,获取所有类中的属性信息,但是无法获取到父类的信息。格式如下:

    Class clz = JueJinUser.class;
            Field[] fields = clz.getFields();
            System.out.println("--- getFields start ---");
            for (Field field : fields) {
                System.out.println(field.getName());
            }
            System.out.println("--- getFields end ---");
    
    
            System.out.println("--- getDeclaredFields start ---");
            Field[] declaredFields = clz.getDeclaredFields();
            for (Field field : declaredFields) {
                System.out.println(field.getName());
            }
            System.out.println("--- etDeclaredFields end ---");

    获取类中的构造方法

    通过getConstructors和getDeclaredConstructors的方法,可以获取类中的构造方法信息,其中getConstructors可以获取类中构造方法,而getDeclaredConstructors的方法,获取所有类中的构造方法,但是无法获取到父类的构造方法信息。格式如下:

     System.out.println("--- getConstructors start ---");
            Constructor[] constructors = clz.getConstructors();
            for (Constructor constructor : constructors) {
                System.out.println(constructor.getName());
            }
            System.out.println("--- getConstructors end ---");
    
            System.out.println("---getDeclaredConstructors start---");
            Constructor[] declaredConstructors = clz.getDeclaredConstructors();
            for (Constructor constructor : declaredConstructors) {
                System.out.println(constructor.getName());
            }
            System.out.println("---getDeclaredConstructors end---");

    获取类中方法

    通过getMethods和getDeclaredMethods的方法,可以获取类中的构造方法信息,其中getMethods可以获取类中构造方法,而getDeclaredMethods的方法,获取所有类中的方法,但是无法获取到父类的方法信息。格式如下:

     System.out.println("--- getMethods start ---");
            Method[] methods = clz.getMethods();
            for (Method method : methods) {
                System.out.println(method.getName());
            }
            System.out.println("--- getMethods end ---");
    
    
            System.out.println("--- getDeclaredMethods start---");
            Method[] declaredMethods = clz.getDeclaredMethods();
            for (Method method : declaredMethods) {
                System.out.println(method.getName());
            }
            System.out.println("--- getDeclaredMethods end ---");

    关于“Java反射如何使用”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI