【Java反射】反射获取Class、Constructor、Field、Method的方式

这篇具有很好参考价值的文章主要介绍了【Java反射】反射获取Class、Constructor、Field、Method的方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

package com.coding.reflect;

/**
 * @time 2023-02-22-10:16
 */

public class Car {

    //属性
    private String name;
    private int age;
    private String color;

    //无参数构造
    public Car() {
    }

    //有参数构造
    public Car(String name, int age, String color) {
        this.name = name;
        this.age = age;
        this.color = color;
    }

    //普通方法
    private void run() {
        System.out.println("私有方法-run.....");
    }

    //get和set方法
    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;
    }
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }

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

如下是相应的获取方式

public class TestCar {

    //1、获取Class对象多种方式
    @Test
    public void test01() throws Exception {
        //1 类名.class
        Class clazz1 = Car.class;

        //2 对象.getClass()
        Class clazz2 = new Car().getClass();

        //3 Class.forName("全路径")
        Class clazz3 = Class.forName("com.coding.reflect.Car");

        //实例化
        Car car = (Car)clazz3.getConstructor().newInstance();
        System.out.println(car);
    }

    //2、获取构造方法
    @Test
    public void test02() throws Exception {
        Class clazz = Car.class;
        //获取所有构造
        // getConstructors()获取所有public的构造方法
//        Constructor[] constructors = clazz.getConstructors();
        // getDeclaredConstructors()获取所有的构造方法public  private
        Constructor[] constructors = clazz.getDeclaredConstructors();
        for (Constructor c:constructors) {
            System.out.println("方法名称:"+c.getName()+" 参数个数:"+c.getParameterCount());
        }

        //指定有参数构造创建对象
        //1 构造public
//        Constructor c1 = clazz.getConstructor(String.class, int.class, String.class);
//        Car car1 = (Car)c1.newInstance("夏利", 10, "红色");
//        System.out.println(car1);

        //2 构造private
        Constructor c2 = clazz.getDeclaredConstructor(String.class, int.class, String.class);
        c2.setAccessible(true);
        Car car2 = (Car)c2.newInstance("捷达", 15, "白色");
        System.out.println(car2);
    }

    //3、获取属性
    @Test
    public void test03() throws Exception {
        Class clazz = Car.class;
        Car car = (Car)clazz.getDeclaredConstructor().newInstance();
        //获取所有public属性
        //Field[] fields = clazz.getFields();
        //获取所有属性(包含私有属性)
        Field[] fields = clazz.getDeclaredFields();
        for (Field field:fields) {
            if(field.getName().equals("name")) {
                //设置允许访问
                field.setAccessible(true);
                field.set(car,"五菱宏光");
                System.out.println(car);
            }
            System.out.println(field.getName());
        }
    }

    //4、获取方法
    @Test
    public void test04() throws Exception {
        Car car = new Car("奔驰",10,"黑色");
        Class clazz = car.getClass();
        //1 public方法
        Method[] methods = clazz.getMethods();
        for (Method m1:methods) {
            //System.out.println(m1.getName());
            //执行方法 toString
            if(m1.getName().equals("toString")) {
                String invoke = (String)m1.invoke(car);
                //System.out.println("toString执行了:"+invoke);
            }
        }

        //2 private方法
        Method[] methodsAll = clazz.getDeclaredMethods();
        for (Method m:methodsAll) {
            //执行方法 run
            if(m.getName().equals("run")) {
                m.setAccessible(true);
                m.invoke(car);
            }
        }
    }
}

总结:
首先获取对象的Class,然后通过getXXX方法获取,带Declared可以通过setAccessible获取私有XXX文章来源地址https://www.toymoban.com/news/detail-782222.html

到了这里,关于【Java反射】反射获取Class、Constructor、Field、Method的方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Java笔记040-反射/反射机制、Class类

    目录 反射(reflection) 一个需求引出反射 反射机制 Java反射机制原理图 Java反射机制可以完成 反射相关的主要类 反射机制的优点和缺点 反射调用优化-关闭访问检查 Class类 基本介绍 代码解释部分 类加载方法 应用实例:Class02.java 获取Class类对象 代码解释部分 哪些类型有Class对象

    2024年02月09日
    浏览(47)
  • java.lang.Class<...> has no zero argument constructor。registerReceiver(myBroadcastReceiver, filter)。

    写在前面:确切的说,这是采过的坑,记录的日志。或许,至今还在坑中,而不自知…… 出现问题的起因:自定义了一个广播,并发送广播。 然后在另一个Activity中接收广播。 在注册广播时:registerReceiver(myBroadcastReceiver, filter);黄标报错。 就像这样: 提示: `myBroadcastRece

    2024年02月21日
    浏览(25)
  • 【Java 基础篇】Java反射:深入了解Class对象

    Java是一门强类型语言,它要求在编译时知道所有的类和对象类型。然而,有时候我们需要在运行时动态地获取和操作类的信息,这就是Java反射的用武之地。本文将深入探讨Java反射,特别是与Class对象相关的内容。 反射是一种机制,允许我们在运行时检查、获取和操作类的信

    2024年02月06日
    浏览(48)
  • Unable to make field private final java.lang.Class java.lang.invoke

    java版本是17 mybatis-plus 版本是3.5.1 报错内容如下:  Unable to make field private final java.lang.Class java.lang.invoke.SerializedLambda.capturingClass accessible: module java.base does not \\\"opens java.lang.invoke\\\" to unnamed module @4f6ee6e4 解决方式: idea版本是2023.1.3  shift+F4 或者 Edit configruation... 修改参数 Modify Optio

    2024年02月11日
    浏览(47)
  • Mybatisplus报错 field private final java.lang.Class java.lang.invoke.SerializedLambda.capturingClass

    Unable to make field private final java.lang.Class java.lang.invoke.SerializedLambda.capturingClass accessible: module java.base does not “opens java.lang.invoke” to unnamed module @6dc17b83 其实是Mybatisplus和Java的版本兼容出现了问题。 这个错误是因为在 Java 9 及之后的版本中,模块化系统 (Module System) 引入了访问限

    2024年02月04日
    浏览(56)
  • Can not set java.lang.String field com.iS.UserEntity.name to java.lang.Class

    通过反射获取运行时对象的属性时遇到 java.lang.IllegalArgumentException: Can not set java.lang.String field com.iS.UserEntity.name to java.lang.Class 通过field.get(obj)引用错误,这里的obj应该是运行时的obj对象,而非.getClass()后的类型 错误的: 正确的:

    2024年02月16日
    浏览(47)
  • 【Java反射】Java利用反射获取和设置对象某属性的值

    通用工具类: 测试:

    2024年02月02日
    浏览(54)
  • RabbitMQ Failed to convert message.No method found for class java.lang.String问题解决

            org.springframework.amqp.rabbit.support.ListenerExecutionFailedException: Failed to convert message         Caused by: org.springframework.amqp.AmqpException: No method found for class java.lang.String 1、消息生产者发送的消息类型为String,消息消费者接收的消息类型为Message,导致接收的时候类型转换不

    2024年02月16日
    浏览(57)
  • Java中的反射(通过反射获取类的结构、invoke方法、获取注解)

    创建运行时类的对象是反射机制应用最多的地方。创建运行时类的对象有两种方式: 方式1:直接调用Class对象的newInstance()方法 要求: 1)类必须有一个无参数的构造器。 2)类的构造器的访问权限需要足够。 方式一的步骤 : 1)获取该类型的Class对象 2)调用Class对象的 new

    2024年02月04日
    浏览(49)
  • Java 反射设置/获取对象属性值

    ✨大家好,我是【zhuzicc】~ ,一位主攻【Java】的 攻城狮!✨ 欢迎对【Java】感兴趣的大佬,关注我 😜 ———————————————— ❤️ ❤️ ❤️ 如果觉得本文还不错,点赞 + 评论 + 关注 + 收藏。有补充欢迎评论交流,我将努力创作更多更好的文章。 大佬们的支持

    2024年02月07日
    浏览(51)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包