java 反射 mapreduce_java 反射

本文探讨了两种实现公共类JobRunner的方法。方案一是通过暴力反射获取类的方法并调用,方案二是定义一个公共接口GenericJob,让具体类实现该接口。两种方法分别在处理参数化实例化和调用getJob方法上有所不同,适用于不同场景。
摘要由CSDN通过智能技术生成

现有一个需求要求公共类的main方法要根据传入的参数实例化某个具体类,并调用该类的都有的一个方法getJob做某些操作。

参数类型

参数1 自定义job类型的名称

参数2 输出路径

参数3,4,5... 输入路径*/

Java%E5%8F%8D%E5%B0%84%E5%8F%82%E6%95%B0%E9%85%8D%E7%BD%AE.png

enter description here

方案一 暴力反射,获取类方法直接调用

package com.bigdata.AIDoctorGuide.job;

import java.lang.reflect.Constructor;

import java.lang.reflect.Method;

import java.util.Arrays;

import org.apache.hadoop.mapreduce.Job;

//使用反射来构建自定义的job对象,并且调用getJob方法获取MR的job实例

public class JobRunner {

public static void main(String[] args) throws Exception {

if (args.length < 3) {

System.err.println("参数输入不争取,,,");

System.exit(1);

}

String className = args[0];

String outputPath = args[1];

String[] inputPaths = Arrays.copyOfRange(args, 2, args.length);

Class cz = Class.forName(className);

//获取该类的构造方法

Constructor[] constructors = cz.getConstructors();

//规则规定:该类只有一个非默认的构造方法,并且接受两个参数,

//一个参数为string 另一个为string[] 如RecordReimburseJob类构造方法

Constructor constructor = constructors[0];

//方案一 很暴力

Object testInstance = constructor.newInstance(outputPath,inputPaths);

Job testJob = null;

// Method[] methods = cz.getMethods();

// for (Method method : methods) {

// if (method.getName().equals("getJob")) {

// testJob = (Job)method.invoke(testInstance);

// break;

// }

// }

Method getJobMethod = cz.getMethod("getJob");

if (getJobMethod != null) {

testJob = (Job)getJobMethod.invoke(testInstance);

}

long startTime = System.currentTimeMillis();

boolean flag = testJob.waitForCompletion(true);

if (flag == true) {

long endTime = System.currentTimeMillis();

System.out.println("job 运行成功,耗时 :" + (endTime - startTime)/1000 + "秒");

}else {

System.out.println("程序运行失败,请检查日志");

}

}

}

方案二 定义一个公共接口类GenericJob,所有使用JobRunner运行的类都需要实现该接口

package com.bigdata.AIDoctorGuide.job;

import org.apache.hadoop.mapreduce.Job;

public interface GenericJob {

public Job getJob() throws Exception;

}

使用接口类接受实例化后的具体类,然后直接调用getJob方法,然后进行后续的操作

package com.bigdata.AIDoctorGuide.job;

import java.lang.reflect.Constructor;

import java.lang.reflect.Method;

import java.util.Arrays;

import org.apache.hadoop.mapreduce.Job;

//使用反射来构建自定义的job对象,并且调用getJob方法获取MR的job实例

public class JobRunner {

public static void main(String[] args) throws Exception {

/*

* 参数1 自定义job类型的名称

* 参数2 输出路径

* 参数3,4,5... 输入路径*/

if (args.length < 3) {

System.err.println("参数输入不争取,,,");

System.exit(1);

}

String className = args[0];

String outputPath = args[1];

String[] inputPaths = Arrays.copyOfRange(args, 2, args.length);

Class cz = Class.forName(className);

//获取该类的构造方法

Constructor[] constructors = cz.getConstructors();

//规则规定:该类只有一个非默认的构造方法,并且接受两个参数,

//一个参数为string 另一个为string[] 如RecordReimburseJob类构造方法

Constructor constructor = constructors[0];

GenericJob jobObject = (GenericJob)constructor.newInstance(outputPath,inputPaths);

Job recordJob = jobObject.getJob();

long startTime = System.currentTimeMillis();

boolean flag = recordJob.waitForCompletion(true);

if (flag == true) {

long endTime = System.currentTimeMillis();

System.out.println("job 运行成功,耗时 :" + (endTime - startTime)/1000 + "秒");

}else {

System.out.println("程序运行失败,请检查日志");

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值