网站设计网站建设专业,二级网站建设方案模板,长沙优化网站服务,自己做家具网站记录#xff1a;473
场景#xff1a;使用java.lang.reflect.Method和java.lang.Class类#xff0c;根据Java反射原理实现使用指定字符串类名和方法名称#xff0c;调用对应对象和对应方法。
版本#xff1a;JDK 1.8。
1.使用Java反射调用指定类的指定方法
(1)参数说明…记录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();ListObject task01 Arrays.asList(com.hub.example.p11.reflect.work.HostSportGames,tableTennisContest, team01);ListObject task02 Arrays.asList(com.hub.example.p11.reflect.work.HostSportGames,swimmingContest, team02);ListListObject taskList Arrays.asList(task01, task02);//2.执行业务for (ListObject 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女子组, event200米决赛, 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 ListString athlete;
}
以上感谢。
2023年9月13日