【Java】反射简介,利用反射打印一个类当中的构造函数,方法和属性。

这篇具有很好参考价值的文章主要介绍了【Java】反射简介,利用反射打印一个类当中的构造函数,方法和属性。。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【Java】反射简介,利用反射打印一个类当中的构造函数,方法和属性。,java,开发语言

  📝个人主页:哈__

期待您的关注 

【Java】反射简介,利用反射打印一个类当中的构造函数,方法和属性。,java,开发语言

我想要通过反射来打印如下效果的类信息。

【Java】反射简介,利用反射打印一个类当中的构造函数,方法和属性。,java,开发语言

Student类如下代码所示。

package com.my.reflect;

public class Student {
    public String name;
    public int age;

    public Student(){}
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    private void test(String str){
        System.out.println("哈哈哈"+str);
    }
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

 你是否有思路?如果你不了解反射的话,我来给大家简单的介绍一下反射的使用方法。

一、反射简介

1、Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取对象的各种信息。
2、Java属于先编译再运行的语言,程序中对象的类型在编译期就确定下来了,而当程序在运行时可能需要动态加载某些类,这些类因为之前用不到,所以没有被加载到JVM。通过反射,可以在运行时动态地创建对象并调用其属性,不需要提前在编译期知道运行的对象是谁。

在具体的东西,本文章不在这里叙述,总而言之,我们可以通过反射获取一个类的class对象,并且通过这个class对象获得这个类当中的信息。就是说,只要我能知道是哪个类,那么这个类对于我来说基本上就是透明的了。

二、反射的一些常用方法

1.获取一个类的class对象的三种方法

通过包名获取。

Class clazz = Class.forName("com.my.reflect.Student");

通过类获取。

Class clazz = Student.class;

通过类的对象获取 (能够拿到这个类的对象但是不知道是什么类,你可以假定下边的代码没有第一行,只有第二行,那么你能否知道s是哪个类的对象?)。

Student s = new Studnet();
Class clazz = s.getClass();

以上三种获取方式相同,但是需要区分不同的场景采取不同的获取方式。 

2.获取一个类的构造函数

通过class对象我们可以获取这个类的构造函数。传入的参数是一些class对象,通过这些class对象能确定你要获取的是哪个构造函数,例如下边代码。我们获取的构造函数有两个参数,第一个参数是String类型,第二个参数是int类型,通过这两个class对象,我们能够正确的获取构造参数。

//class.getConstructor(Class<?>... parameterTypes)
Constructor constructor= clazz.getConstructor(String.class,int.class);
//public Student(String name,int age){}

//获取类的全部构造函数
Constructor [] constructors= clazz.getConstructors();

 3.获取一个类的方法

通过调用如下代码获取一个类的方法。注意参数,第一个参数是name,代表着你想要获取的方法的名称,第二个参数不陌生了吧,在上边我们获取构造函数的时候见过,这个参数就代表着你要获取的方法的参数类型都是什么,防止方法重载的影响。

//getMethod(String name, Class<?>... parameterTypes)
Method method = clazz.getMethod();
//获取全部的方法 不需要传参
Method [] method = clazz.getMethods();

我们都知道在一个类中,方法有public修饰也有private修饰,还有protected和什么都不写,那么我们在获取Method的时候,我们只能获得类中的公有方法,私有方法我们是无法获取的,这时候就要用到下边的方法来获取一个类中的私有方法。

Method method = clazz.getDeclaredMethod();
//获取全部的方法,包括私有 不需要传参
Method [] methods = clazz.getDeclaredMethods();

 写了这行代码,不管你的方法是共有的还是私有的都可以获取到。

4.获取一个类中的属性

通过下边的代码来获取一个类当中的属性。传入的name就是要获取的属性的名称。当然除了获取单个的属性外我们还可以获取全部的属性。如果你想要获取私有属性同样的要调用带有Declared的方法。

//getField(String name)
Field field =  clazz.getField();
//不需要传入参数
Field [] fields =  clazz.getFields();
// 获取单个私有属性  
Field  privateField =  clazz.getDeclaredField(name);
// 获取全部私有属性 不要参数
Field  [] allPrivateField =  clazz.getDeclaredField();

5.获取一个类、方法和属性的修饰符 

我们都知道类、方法和属性都是有修饰符的,如public、final、private、static等,我们可以通过调用以下的方法来获取。

Class clazz = Class.forName("com.my.reflect.Student");
        Constructor constructor = clazz.getConstructor(String.class, int.class);
        int modifiers = constructor.getModifiers();
        System.out.println(modifiers);
        System.out.println(Modifier.toString(modifiers));

        Method method = clazz.getDeclaredMethod("test",String.class);
        int modifiers1 = method.getModifiers();
        System.out.println(modifiers1);
        System.out.println(Modifier.toString(modifiers1));

结果如下所示。

 【Java】反射简介,利用反射打印一个类当中的构造函数,方法和属性。,java,开发语言

这个modifers到底该如何使用呢,别急这里有一张表格。

【Java】反射简介,利用反射打印一个类当中的构造函数,方法和属性。,java,开发语言 

modifier的值是一个累加的结果,大家可以自己试一试。在上边的代码中我们能够看到,构造方法和普通方法都可以调用 getModifiers()方法,当然属性也可以。

以上就要反射的简单介绍,在这片文章中我并没有介绍通过class获取的constructor、method和field该如何使用,以后有机会的话我会发一篇文章介绍,我这篇文章主要的目的是解决一开始的问题。

三、问题解决

有了上面的基础之后,我们来解决问题,要打印一个类的信息,我们先要打印这是哪个类。这里用到了一个getSuperclass方法,获取这个类的父类的class对象,帮助我们打印继承关系。下边我们先打印了这个类的修饰符public 然后打印了类名,通过调用getName方法。

try{
            Class c1 = Class.forName("com.my.reflect.Student");
            Class superc1 = c1.getSuperclass();

            //获取类的修饰符
            String modifiers = Modifier.toString(c1.getModifiers());
             System.out.print(modifiers);
            System.out.print(" class "+c1.getName());
            if(modifiers.length()>=0) System.out.println(" extends "+superc1.getName());
            System.out.print("\n{\n");
            System.out.print("\n}\n");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

 结果如下。是不是有些样子了?

【Java】反射简介,利用反射打印一个类当中的构造函数,方法和属性。,java,开发语言

现在我们打印构造函数。构造方法不止一个,我们调用的是getDeclaredConstructors(),之后进行for循环遍历,每一个获取到的constructor对象我们获取他的名称,获取这个构造方法的修饰符,然后打印。这时问题来了,一个方法是有参数的,我们需要获取这个构造方法的所有参数信息。这里调用getParameterTypes()方法,然后对所有的参数类型进行for循环进行遍历,然后打印这个方法的所有的参数的类型。

public static void printConstrctors(Class c1){
        Constructor[] constructors = c1.getDeclaredConstructors();
        for(Constructor c:constructors){
            String name = c.getName();
            System.out.print("   ");
            //获取构造方法的作用域
            String modifiers = Modifier.toString(c1.getModifiers());
            if(modifiers.length()>0) System.out.print(modifiers+" ");
            System.out.print(name+"(");

            Class[] paramTypes = c.getParameterTypes();
            for(int j = 0;j< paramTypes.length;j++){
                if(j>0) System.out.print(", ");
                System.out.print(paramTypes[j].getName());
            }
            System.out.println(")");
        }
    }

看结果。 

【Java】反射简介,利用反射打印一个类当中的构造函数,方法和属性。,java,开发语言

之后就是我们的方法了,既然构造函数会打印了,方法是一个道理。不在讲解了。注意一个resType,也就是返回值类型。

 public static void printMethods(Class c1){

        Method[] methods = c1.getDeclaredMethods();
        for(Method m:methods){
            Class resType = m.getReturnType();
            String name = m.getName();
            System.out.print("    ");
            String modifiers = Modifier.toString(m.getModifiers());
            if(modifiers.length()>0) System.out.print(modifiers+" ");
            System.out.print(resType.getName()+" "+name+"(");
            Class [] paramTypes = m.getParameterTypes();
            for(int j = 0;j< paramTypes.length;j++){
                if(j>0) System.out.print(", ");
                System.out.print(paramTypes[j].getName());
            }
            System.out.println(")");
        }
    }

 【Java】反射简介,利用反射打印一个类当中的构造函数,方法和属性。,java,开发语言

最后就是我们的属性了。

public static void printFields(Class c1){
        Field [] fields = c1.getDeclaredFields();
        for (Field field : fields) {
            Class type = field.getType();
            String name = field.getName();
            System.out.print("    ");
            String modifiers = Modifier.toString(field.getModifiers());
            if(modifiers.length()>0) System.out.print(modifiers+" ");
            System.out.println(type.getName()+" "+name+";");
        }
    }

【Java】反射简介,利用反射打印一个类当中的构造函数,方法和属性。,java,开发语言

完美解决。

 四、完整代码

public class ReflectTest {
    public static void main(String[] args) {
        try{
            Class c1 = Class.forName("com.my.reflect.Student");
            Class superc1 = c1.getSuperclass();

            //获取类的作用域
            String modifiers = Modifier.toString(c1.getModifiers());
            System.out.print(modifiers);
            System.out.print(" class "+c1.getName());
            if(modifiers.length()>=0) System.out.println(" extends "+superc1.getName());
            System.out.print("\n{\n");
            printConstrctors(c1);
            System.out.println();
            printMethods(c1);
            System.out.println();
            printFields(c1);
            System.out.print("\n}\n");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    public static void printConstrctors(Class c1){
        Constructor[] constructors = c1.getDeclaredConstructors();
        for(Constructor c:constructors){
            String name = c.getName();
            System.out.print("   ");
            //获取构造方法的作用域
            String modifiers = Modifier.toString(c1.getModifiers());
            if(modifiers.length()>0) System.out.print(modifiers+" ");
            System.out.print(name+"(");

            Class[] paramTypes = c.getParameterTypes();
            for(int j = 0;j< paramTypes.length;j++){
                if(j>0) System.out.print(", ");
                System.out.print(paramTypes[j].getName());
            }
            System.out.println(")");
        }
    }

    public static void printMethods(Class c1){

        Method[] methods = c1.getDeclaredMethods();
        for(Method m:methods){
            Class resType = m.getReturnType();
            String name = m.getName();
            System.out.print("    ");
            String modifiers = Modifier.toString(m.getModifiers());
            if(modifiers.length()>0) System.out.print(modifiers+" ");
            System.out.print(resType.getName()+" "+name+"(");
            Class [] paramTypes = m.getParameterTypes();
            for(int j = 0;j< paramTypes.length;j++){
                if(j>0) System.out.print(", ");
                System.out.print(paramTypes[j].getName());
            }
            System.out.println(")");
        }
    }

    public static void printFields(Class c1){
        Field [] fields = c1.getDeclaredFields();
        for (Field field : fields) {
            Class type = field.getType();
            String name = field.getName();
            System.out.print("    ");
            String modifiers = Modifier.toString(field.getModifiers());
            if(modifiers.length()>0) System.out.print(modifiers+" ");
            System.out.println(type.getName()+" "+name+";");
        }
    }


}

如果对您有帮助,希望可以博主一个关注。

 文章来源地址https://www.toymoban.com/news/detail-846593.html

到了这里,关于【Java】反射简介,利用反射打印一个类当中的构造函数,方法和属性。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一个Java反射小工具

     利用JDK提供的反射工具类,可实现简单的Java Bean的属性赋值、获取属性值、获取所有属性及指定属性名的属性等。

    2024年04月25日
    浏览(30)
  • 【Java编程教程】详解Java 构造函数

    在Java中,构造函数是类似于方法的代码块。它在创建类的实例时被调用。在调用构造函数时,对象的内存是在内存中分配的。 它是一种特殊类型的方法,用于初始化对象。 每次使用 new() 创建对象时,至少会调用一个构造函数。 如果类中没有可用的构造函数,它会调

    2024年02月06日
    浏览(43)
  • java中构造函数在继承中的调用顺序是什么?

    在Java中,当创建子类对象时,构造函数的调用顺序遵循以下规则: 父类的静态变量和静态初始化块 :首先,Java会加载父类,并执行父类中的静态变量初始化和静态初始化块(静态代码块)。这只会在类首次被加载到JVM时执行一次。 子类的静态变量和静态初始化块 :接下来

    2024年04月10日
    浏览(41)
  • Java8函数式接口, 方法引用, 构造器引用, 数组引用

    只包含一个抽象方法的接口,称为函数式接口。 你可以通过Lambda表达式来创建该接口的对象。(若Lambda表达式抛出一个受检异常(即:非运行时异常),那么该异常需要在目标接口的抽象方法上进行声明 我们可以在一个接口上使用 @Functionallnterface 注解,这样做可以检查它是

    2024年02月05日
    浏览(57)
  • 递归--打印一个字符串的全部排列(java)

    自负串全排序: 举例: abc 的全排序是: abc acb bac bca cba cab 因为每个字符都要选,其实就是选择每个字符的顺序,那我们递归时,就可以把不同顺序一直递归下去. 代码演示 解题思路: 我们可以按上面的代码去做,只需要用HashSet 去保存答案,就会去重了,但这样并没有优化效率,在递归时

    2024年02月06日
    浏览(52)
  • Mysql当中Json相关的函数详解

    从5.7开始,MySQL开始支持json类型,用于存储JSON数据。提供数据类型的同时也提供了很多关于json的函数供我们使用,本篇文章基本上都来源于官网;https://dev.mysql.com/doc/refman/8.0/ja/json-function-reference.html 2.1.JSON_ARRAY(转换json数组) 描述: JSON_ARRAY() 接受一个值列表(可能为NULL),并

    2024年02月08日
    浏览(39)
  • 简介:在这篇教程中,我们将使用React.js框架创建一个简单的聊天机器人的前端界面,并利用Dialogflo

    作者:禅与计算机程序设计艺术 介绍及动机 聊天机器人(Chatbot)一直是互联网领域中的热门话题。而很多聊天机器人的功能都依赖于人工智能(AI)技术。越来越多的企业希望拥有自己的聊天机器人系统,从而提升自己的竞争力。为此,业界也出现了很多基于开源技术或云

    2024年02月06日
    浏览(59)
  • 【C++】做一个飞机空战小游戏(二)——利用getch()函数实现键盘控制单个字符移动

     [导读]本系列博文内容链接如下: 【C++】做一个飞机空战小游戏(一)——使用getch()函数获得键盘码值 【C++】做一个飞机空战小游戏(二)——利用getch()函数实现键盘控制单个字符移动 【C++】做一个飞机空战小游戏(三)——getch()函数控制任意造型飞机图标移动 【C++】做一个飞

    2024年02月15日
    浏览(40)
  • Protobuf 反射技术简介

    对于反射大家应该不会陌生,如果你接触过一些框架(如 ORM、IOC、OSGi 等) 的内部实现,应该更能体会反射技术的应用可谓无处不在。 反射概念最早出现于人工智能领域,20 世纪 70 年代末被引入到程序语言设计中。1982 年 MIT 的 Smith, Brian Cantwell 在他的博士论文中最早提出了

    2024年01月22日
    浏览(38)
  • 【SQL开发实战技巧】系列(二十七):数仓报表场景☞通过对移动范围进行聚集来详解分析函数开窗原理以及如何一个SQL打印九九乘法表

    【SQL开发实战技巧】系列(一):关于SQL不得不说的那些事 【SQL开发实战技巧】系列(二):简单单表查询 【SQL开发实战技巧】系列(三):SQL排序的那些事 【SQL开发实战技巧】系列(四):从执行计划讨论UNION ALL与空字符串UNION与OR的使用注意事项 【SQL开发实战技巧】系列

    2023年04月09日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包