Java的反射应用(Method和Class)

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

记录:473

场景:使用java.lang.reflect.Method和java.lang.Class类,根据Java反射原理实现使用指定字符串类名和方法名称,调用对应对象和对应方法。

版本:JDK 1.8。

1.使用Java反射调用指定类的指定方法

(1)参数说明

String className, 字符串类型,需反射的类的全路径。

String methodName, 字符串类型,需反射的类的方法名称。

Object params,对象类型,反射调用方法的输入参数。

Object,返回值,反射调用方法的输出参数。

(2)代码实现

public class ReflectApplyUtils {
    /**
     * 根据类名称和方法名称执行指定类的指定方法
     * 获取public方法
     * Method[] method01 = clasz.getMethods();
     * 获取private方法
     * Method[] method02 = clasz.getDeclaredMethods();
     */
    public static Object executeByName(String className, String methodName, Object params) {
        Object result = null;
        try {
            //1.根据类名称获取该类对应的Class对象
            Class<?> clasz = Class.forName(className);
            //2.根据方法名称获取改方法对应的Method对象
            Method method = null;
            for (Method var1 : clasz.getMethods()) {
                if (StringUtils.equals(var1.getName(), methodName)) {
                    method = var1;
                    break;
                }
            }
            //3.执行具体方法
            if (method != null) {
                //获取方法的Modifier值,在根据Modifier定义的常量可以判断方式是哪种类型
                int var2 = method.getModifiers();
                if (Modifier.isPublic(var2) && Modifier.isStatic(var2)) {
                    result = method.invoke(clasz, params);
                } else if (Modifier.isPublic(var2) && !Modifier.isStatic(var2)) {
                    result = method.invoke(clasz.newInstance(), params);
                } else {
                    throw new Exception("提供的方法名称: " + methodName + ",不是public类型,无权限执行.");
                }
            } else {
                throw new Exception("根据方法名称: " + methodName + ",无法找到对应Method,请检查输入的方法名称是否正确.");
            }
        } catch (Exception e) {
            result = e;
        }
        return result;
    }
}

2.一个普通Java类

本示例中,将使用反射调用此类。

/**
 * java.lang.StringBuffer,线程安全(A thread-safe)
 * java.lang.StringBuilder,非线程安全
 */
public class HostSportGames {
    public static String tableTennisContest(TeamDto team) {
        StringBuffer sb = new StringBuffer();
        sb.append("执行业务: ").append(team.getTeamName())
                .append(team.getGroup()).append("参加")
                .append(team.getEvent()).append(",运动员:");
        StringBuffer finalSb = sb;
        team.getAthlete().forEach((item) -> {
            finalSb.append(item).append(",");
        });
        sb = sb.replace(sb.length() - 1, sb.length(), ".");
        System.out.println(sb);
        return "乒乓球比赛成功";
    }
    public String swimmingContest(TeamDto team) {

        StringBuilder sb = new StringBuilder();
        sb.append("执行业务: ").append(team.getTeamName())
                .append(team.getGroup()).append("参加")
                .append(team.getEvent()).append(",运动员:");
        StringBuilder finalSb = sb;
        team.getAthlete().forEach((item) -> {
            finalSb.append(item).append(",");
        });
        sb = sb.replace(sb.length() - 1, sb.length(), ".");
        System.out.println(sb);
        return "游泳比赛成功";
    }
    private Object footballContest(TeamDto team) {
        System.out.println("暂无此赛事.");
        return "暂无此比赛";
    }
}

3.Java反射调用指定类的指定方法

(1)代码实现

public class ApplyReflect {
    public static void main(String[] args) {
        //1.数据准备
        TeamDto team01 = TeamDto.builder()
                .teamName("中国乒乓球队")
                .group("男子组")
                .event("男单决赛")
                .athlete(Arrays.asList("ZhangS", "ZhaoL"))
                .build();
        TeamDto team02 = TeamDto.builder()
                .teamName("中国游泳队")
                .group("女子组")
                .event("200米决赛")
                .athlete(Arrays.asList("ZhangJ", "ZhaoX"))
                .build();
        List<Object> task01 = Arrays.asList(
                "com.hub.example.p11.reflect.work.HostSportGames",
                "tableTennisContest", team01
        );
        List<Object> task02 = Arrays.asList(
                "com.hub.example.p11.reflect.work.HostSportGames",
                "swimmingContest", team02
        );
        List<List<Object>> taskList = Arrays.asList(task01, task02);
        //2.执行业务
        for (List<Object> taskItem : taskList) {
            try{
                System.out.println("*******************************");
                String className = (String) taskItem.get(0);
                String methodName = (String) taskItem.get(1);
                TeamDto params = (TeamDto) taskItem.get(2);
                Object executeResult = null;
                System.out.println("执行" + className + "的" + methodName + "方法.");
                System.out.println("输入参数: " + params.toString());
                executeResult = ReflectApplyUtils.executeByName(className, methodName, params);
                System.out.println("输出结果: " + executeResult);
            }catch (Exception e){
                System.out.println("执行异常.");
                e.printStackTrace();
            }
        }
        System.out.println("*******************************");
    }
}

(2)输出日志

*******************************
执行com.hub.example.p11.reflect.work.HostSportGames的tableTennisContest方法.
输入参数: TeamDto(teamName=中国乒乓球队, group=男子组, event=男单决赛, athlete=[ZhangS, ZhaoL])
执行业务: 中国乒乓球队男子组参加男单决赛,运动员:ZhangS,ZhaoL.
输出结果: 乒乓球比赛成功
*******************************
执行com.hub.example.p11.reflect.work.HostSportGames的swimmingContest方法.
输入参数: TeamDto(teamName=中国游泳队, group=女子组, event=200米决赛, athlete=[ZhangJ, ZhaoX])
执行业务: 中国游泳队女子组参加200米决赛,运动员:ZhangJ,ZhaoX.
输出结果: 游泳比赛成功
*******************************

4.辅助实体类

(1)说明

在实体类中使用注解@Data等来自lombok-1.18.24.jar。

(2)代码

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class TeamDto implements Serializable {
    //球队名称
    private String teamName;
    //组别:男子组/女子组/混合组
    private String group;
    //比赛项目名称
    private String event;
    //团队成员
    private List<String> athlete;
}

以上,感谢。

2023年9月13日文章来源地址https://www.toymoban.com/news/detail-709612.html

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

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

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

相关文章

  • 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日
    浏览(48)
  • Java进阶(1)——JVM的内存分配 & 反射Class类的类对象 & 创建对象的几种方式 & 类加载(何时进入内存JVM)& 注解 & 反射+注解的案例

    1.java运行时的内存分配,创建对象时内存分配; 2.类加载的顺序,创建一个唯一的类的类对象; 3.创建对象的方式,new,Class.forName,clone; 4.什么时候加载.class文件进入JVM内存中,看到new,Class.forName; 5.如何加载?双亲委托(委派)机制:安全;AppClassLoader; 6.反射实质:能

    2024年02月14日
    浏览(34)
  • Java进阶(4)——结合类加载JVM的过程理解创建对象的几种方式:new,反射Class,克隆clone(拷贝),序列化反序列化

    1.类什么时候被加载到JVM中,new,Class.forName: Class.forName(“包名.类名”); 2.创建对象的方式,反射,本质是获得类的类对象Class; 3.克隆clone,深拷贝,浅拷贝的对比; 4.序列化和反序列化的方式; Hello h; // 此时没有用Hello,jvm并没有进行类加载 看到new : new Book() Class.forName:

    2024年02月12日
    浏览(36)
  • 【Java 基础篇】Java 反射详解

    Java反射是指在运行时动态地获取类的信息,并可以通过该信息来操作类或对象。通过反射,我们可以在运行时获取类的字段、方法、构造函数等信息,并能够动态地创建对象、调用方法、访问和修改字段的值。本文将详细介绍Java反射的概念、原理和使用方法,并提供一些示

    2024年02月09日
    浏览(27)
  • 反射 p2 Class类

    Class也是类,因此也继承Object类; Class类对象不是new出来的,而是系统创建的; 对于某个类的Class类对象,在内存中只有一份,因为类只加载一次; 每个类的实例都会记得自己是由哪个Class实例所生成的; 通过Class对象可以完整的得到一个类的完整结构,通过一系列API; Cla

    2024年02月16日
    浏览(27)
  • Java基础篇——反射&枚举

    B友:https://www.bilibili.com/video/BV1QG4y1J76q/ VIP服务课程 :https://edu.51cto.com/course/32767.html 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过类的【加载】,【连接】,【初始化】 这三个步骤来对类进行初始化。 如果不出现意外情况,JVM将会连续完成这三个步

    2024年02月12日
    浏览(29)
  • Java基础_反射机制(尚硅谷-学习笔记)

    反射的概述(熟悉) ● Java给我们提供了一套API,使用这套API我们可以在运行时动态的获取指定对象所属的类,创建运行时类的对象,调用指定的结构(属性、方法)等。 ● API: ○ java.lang.Class:代表一个类 ○ java.lang.reflect.Method:代表类的方法 ○ java.lang.reflect.Field:代表类

    2024年02月11日
    浏览(25)
  • Java安全基础之Java反射机制和ClassLoader类加载机制

    目录 Java 反射机制 反射 java.lang.Runtime ClassLoader 类加载机制 URLClassLoader loadClass() 与 Class.forName() 的区别? Java 反射(Reflection)是 Java 非常重要的动态特性。在运行状态中,通过 Java 的反射机制,我们能够判断一个对象所属的类。了解任意一个类的所有属性和方法。能够调用任

    2024年04月22日
    浏览(29)
  • Java 基础进阶篇(十七):反射概述及获取对象的方式

    反射是指对于任何一个Class类,在 “运行的时候”,不用创建对象,就可以直接得到这个类全部成分。 在运行时,可以直接得到这个类的构造器对象:Constructor 在运行时,可以直接得到这个类的成员变量对象:Field 在运行时,可以直接得到这个类的成员方法对象:Method 这种

    2024年02月07日
    浏览(27)
  • JAVA使用反射机制和注解实现对信息的处理-----JAVA入门基础教程

    import java.lang.annotation.Annotation; import java.lang.reflect.Field; public class AnnotationTest { public static void main(String[] args) throws Exception { Class c = Class.forName(\\\"Customer\\\"); c = Customer.class; Table table = (Table)c.getDeclaredAnnotation(Table.class); System.out.println(table.value()); Annotation[] annotations = c.getDeclaredAnnotatio

    2024年02月15日
    浏览(35)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包