JMeter进阶技能(beanshell)内置变量总结,你值得拥有

写JMeter脚本的时候,很多时候都需要调用JMeter的变量,比如:请求头、请求信息、响应头、响应码、响应体等。这时候JMeter的内置变量就排上用场了。

每个beanshell元件支持的变量都不同,每种类型的beanshell都在最下方有说明,例如【BeanShell 取样器

不同类型beanshell元件支持的变量:

BeanShell 取样器

脚本定义了下列变量:

SampleResult, ResponseCode, ResponseMessage, IsSuccess, Label, FileName, ctx, vars, props, log

BeanShell 预处理程序

Script(variables: ctx  vars  props  prev  sampler  log)

BeanShell 后置处理程序

Script(variables: ctx  vars  props  prev  data  log)

BeanShell断言

为脚本定义了下列变量:

Read/Write: Failure, FailureMessage, SampleResult, vars, props, log.

ReadOnly: Response[Data|Code|Message|Headers], RequestHeaders, SampleLabel, SamplerData, ctx

BeanShell 定时器

Script(variables: ctx  vars  props   log  prev  )

BeanShell 监听器

Script(variables: ctx  vars  props  samplerEvent  samplerResult  prev  log)

怎么使用这些变量

我们可以查看JMeter官方文档说明。里面有对每个变量进行调用的说明。说明文档的结构大体分为三个部分。

1、变量类的说明,例如vars变量说明文档中的类说明。

JMeterVariables (Apache JMeter dist API)

2、变量的方法汇总,例如vars变量说明文档中的方法汇总说明。

3、变量的方法详细说明,点击方法汇总中对应的方法就能跳转到对应的调用详细说明的地方。

每个变量的详细汇总

下面是每个变量的详细汇总,日后工作中可以当做操作文档进行快速的查阅并正确的使用。

vars

项目

详细说明

变量名(实例)

vars

JMeter 变量文档说明

JMeterVariables (Apache JMeter dist API)

适合应用的元件

【BeanShell 取样器】、【BeanShell 预处理程序】、【BeanShell 后置处理程序】、

【BeanShell 断言】、【BeanShell 定时器】、【BeanShell 监听器】

org.apache.jmeter.threads.JMeterVariables

public class JMeterVariables方法汇总

entrySet()get(String key)getIteration()getIterator(),getObject(String key)getThreadName()incIteration()isSameUserOnNextIteration()put(String key, String value)putAll(JMeterVariables vars)putAll(Map<String,?> vars)putObject(String key, Object value)remove(String key)

java.lang.Object方法汇总,可以直接用,例如字符串操作中的toString()。

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString

备注

1、vars是org.apache.jmeter.threads.JMeterVariables类的实例,对变量进行读写操作,并且只能在当前线程组内使用。

关键方法的实例:

vars.get()和vars.put()

/*  vars.get(String key);
 *  1、从jmeter中获得变量值,如果不存在则为null
 *  2、id_1来自【数据库应用->增删改查场景应用->操作查询场景的“Varialbe names”】
 *  3、跨线程的变量不可以获取
 */ 
String id1 = vars.get("id_1");
log.info("vars.get()方式:" + id1);

/*  put(String key, String value);
 *  1、创建或更新一个字符型(String)的变量,如果是非String将会报异常
 *  2、如果是数组或boolean或字典或整型... ...,可以使用toString()方法进行转换
 *  3、JMeter其他元件调用时,直接${变量名}
 *  
 */
vars.put("keys1", "必须字符串123truefalse");
List list  = new ArrayList();
String a = "aaa";
int b = 111;
double c = 12.009;
list.add(b);
list.add(a);
list.add(c);
vars.put("keys2",list.toString());

vars.getObject()和entrySet(key)

/*  vars.getObject(key);
 *  1、创建一个变量存储Object对象,如果不存在则为null
 *  2、messages来自【数据库应用->增删改查场景应用->操作查询场景的“Result variable name”】
 */
Object variable_name = vars.getObject("messages"); 
log.info("字典【params】: "+variable_name);

/*  entrySet(key);
 *  1、an unmodifiable view of the entries contained in JMeterVariables
 *  
 */
Map params = new HashMap();  // 创建一个字典
params.put("key","values");
params.put("key1","values1");
params.put("字典key","存储的value");
import java.util.Map.Entry;
Iterator itor = params.entrySet().iterator();
while(itor.hasNext()){
	 Entry entry = (Entry) itor.next();
	 log.info("==========key:"+entry.getKey());  
	 log.info("========Value:"+entry.getValue());  
}

面beanshell脚本运行的结果,可以在JMeter的运行日志可以看到。

vars.getThreadName()和vars.isSameUserOnNextIteration

/*  vars.getThreadName()
 *  1、当前运行线程组的名称
 *  
 */
String threadname = vars.getThreadName();
log.info("线程组【名称】: "+threadname);
/*  vars.isSameUserOnNextIteration()
 *  1、下一个循环中是否是同一个用户,返回true或者false
 *  
 */
boolean resultsameuser = vars.isSameUserOnNextIteration();
log.info("下个循环中是否是同一个用户【resultsameuser】: "+resultsameuser);

props

项目

详细说明

变量名(实例)

props

JMeter 变量文档说明

Properties (Java Platform SE 8 )

适合应用的元件

【BeanShell 取样器】、【BeanShell 预处理程序】、【BeanShell 后置处理程序】、

【BeanShell 断言】、【BeanShell 定时器】、【BeanShell 监听器】

java.util.Properties

Class Properties 方法汇总

getProperty(String key),getProperty(String key, String defaultValue),list(PrintStream out),list(PrintWriter out),load(InputStream inStream),load(Reader reader),loadFromXML(InputStream in),propertyNames(),save(OutputStream out, String comments),setProperty(String key, String value),store(OutputStream out, String comments),store(Writer writer, String comments),storeToXML(OutputStream os, String comment),storeToXML(OutputStream os, String comment, String encoding),stringPropertyNames()

java.util.Hashtable方法汇总,可以直接用,例如字符串操作中的toString()。

clearclonecomputecomputeIfAbsentcomputeIfPresentcontainscontainsKeycontainsValueelementsentrySetequalsforEachgetgetOrDefault,hashCodeisEmptykeyskeySetmergeputputAllputIfAbsentrehashremoveremovereplacereplacereplaceAllsizetoStringvalues

备注

props是java.util.Properties的实例,并且继承了 Hashtable 的类。主要对属性进行读写操作。props可以跨线程组使用

关键方法的实例:

props.containsKey()和props.contains()

/*  props.containsKey()
 *  1、判断某项属性是否存在,返回布尔值
 *  
 */
boolean isexitst_key = props.containsKey("TESTSTART.MS");
log.info("是否存在属性key: "+isexitst_key);
/*   props.contains()
 *  1、判断某项值是否存在,返回布尔值
 *  
 */
boolean isexist_value = props.contains("PROPERTY_VALUE");
log.info("是否存在属性value: "+isexist_value);

props.setProperty()和props.getProperty()

/*   props.setProperty()
 *  1、设置属性的key和value,并且强制对属性键和值使用字符串。
 *  
 */
props.setProperty("cross_thread", "设置跨线程使用属性值");
props.setProperty("exist_props", "设置props的属性值");
/*   props.getProperty()
 *  1、通过输入的key查找属性值,并且返回。
 *  
 */
int counter=0;
for( String key : props.keys() ) {
	if (counter%8==0){
	String value = props.getProperty(key);
	log.info("props_keys第" + counter+"key:【" + key + "】;对应的value为: "+ value);
	}
	counter++;
}

上面beanshell脚本运行的结果,可以在JMeter的运行日志可以看到。

props.remove()和props.values()

/*   props.remove()
 *  1、通过输入的key,删除对应的属性
 *  
 */
props.remove("exist_props");
String get_value=props.getProperty("exist_props", "已被删除,现在等于默认值了");
log.info("exist_props是否存在:" + get_value);
/*   props.values()
 *  1、获取所有属性值
 *  
 */
log.info("【获取所有属性值】 "+props.values());

上面beanshell脚本运行的结果,可以在JMeter的运行日志可以看到。

ctx

项目

详细说明

变量名(实例)

ctx

JMeter 变量文档说明

JMeterContext (Apache JMeter dist API)

适合应用的元件

【BeanShell 取样器】、【BeanShell 预处理程序】、【BeanShell 后置处理程序】、

【BeanShell 断言】、【BeanShell 定时器】、【BeanShell 监听器】

org.apache.jmeter.threads.JMeterContext

public class JMeterContext方法汇总

cleanAfterSample(),clear(),getCurrentSampler(),getEngine(),getPreviousResult(),getPreviousSampler(),getProperties(),getSamplerContext(),getTestLogicalAction(),getThread()  ,getThreadGroup(),getThreadNum(),getVariables(),isRecording(),isRestartNextLoop(),isSamplingStarted(),isStartNextThreadLoop(),setCurrentSampler(Sampler sampler),setEngine(StandardJMeterEngine engine),setPreviousResult(SampleResult result),setRecording(boolean recording),setRestartNextLoop(boolean restartNextLoop),setSamplingStarted(boolean b),setStartNextThreadLoop(boolean restartNextLoop),setTestLogicalAction(JMeterContext.TestLogicalAction actionOnExecution),setThread(JMeterThread thread),setThreadGroup(AbstractThreadGroup threadgrp),setThreadNum(int threadNum),setVariables(JMeterVariables vars)

java.lang.Object方法汇总

cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

备注

ctx是org.apache.jmeter.threads.JMeterContext类的实例,可以访问当前线程的上下文。由于JMeterContext 不具有线程安全性,只适用于单线程。

SampleResult

项目

详细说明

变量名(实例)

SampleResult

JMeter 变量文档说明

SampleResult (Apache JMeter dist API)

适合应用的元件

【BeanShell 取样器】、【BeanShell 断言】

org.apache.jmeter.samplers.SampleResult

public class SampleResult 方法汇总

addAssertionResult(AssertionResult assertResult),addRawSubResult(SampleResult subResult),addSubResult(SampleResult subResult),addSubResult(SampleResult subResult),addSubResult(SampleResult subResult, boolean renameSubResults),cleanAfterSample(),clone(),connectEnd(),createTestSample(long elapsed),createTestSample(long start, long end),currentTimeInMillis(),getAllThreads(),getAssertionResults(),getBodySize(),getBodySizeAsLong(),getBytes(),getBytesAsLong(),getConnectTime(),getContentType(),getDataEncodingNoDefault(),getDataEncodingWithDefault(),getDataEncodingWithDefault(String defaultEncoding),getDataType(),getEndTime(),getErrorCount(),getFirstAssertionFailureMessage(),getGroupThreads(),getHeadersSize(),getIdleTime(),getLatency(),getMediaType(),getParent(),getRequestHeaders(),getResponseCode(),getResponseData(),getResponseDataAsString(),getResponseHeaders(),getResponseMessage(),getResultFileName(),getSampleCount(),getSampleLabel(),getSampleLabel(boolean includeGroup),getSamplerData(),getSaveConfig(),getSearchableTokens(),getSentBytes(),getStartTime(),getSubResults(),getTestLogicalAction(),getThreadName(),getTime(),getTimeStamp(),getURL(),getUrlAsString(),isBinaryType(String ct),isIgnore(),isMonitor(),isRenameSampleLabel(),isResponseCodeOK(),isStampedAtStart(),isStartNextThreadLoop(),isStopTest(),isStopTestNow(),isStopThread(),isSuccessful(),latencyEnd(),markFile(String filename),removeAssertionResults(),removeSubResults(),sampleEnd(),samplePause(),sampleResume(),sampleStart(),setAllThreads(int n),setBodySize(int bodySize),setBodySize(long bodySize),setBytes(int length),setBytes(long length),setConnectTime(long time),setContentType(String string),setDataEncoding(String dataEncoding),setDataType(String dataType),setEncodingAndType(String ct),setEndTime(long end),setErrorCount(int i),setGroupThreads(int n),setHeadersSize(int size),setIdleTime(long idle),setIgnore(),setLatency(long latency),setMonitor(boolean monitor),setParent(SampleResult parent),setRequestHeaders(String string),setResponseCode(String code) ,setResponseCodeOK(),setResponseData(byte[] response),setResponseData(String response),setResponseData(String response, String encoding),setResponseHeaders(String string),setResponseMessage(String msg),setResponseMessageOK(),setResponseOK(),setResultFileName(String resultFileName),setSampleCount(int count),setSampleLabel(String label),setSamplerData(String s),setSaveConfig(SampleSaveConfiguration propertiesToSave),setSentBytes(long sentBytesCount),setStampAndTime(long stamp, long elapsed),setStartNextThreadLoop(boolean startNextThreadLoop),setStartTime(long start),setStopTest(boolean b),setStopTestNow(boolean b),setStopThread(boolean b),setSuccessful(boolean success),setTestLogicalAction(JMeterContext.TestLogicalAction testLogicalAction),setThreadName(String threadName),setTimeStamp(long timeStamp),setURL(URL location),storeSubResult(SampleResult subResult),storeSubResult(SampleResult subResult, boolean renameSubResults),toString()

java.lang.Object方法汇总,可以直接用,例如字符串操作中的toString()。

equalsfinalizegetClasshashCodenotifynotifyAllwaitwaitwait

备注

ResponseCode/ResponseMessage

项目

详细说明

变量名(实例)

ResponseCode/ResponseMessage

JMeter 变量文档说明

-

适合应用的元件

【BeanShell 取样器】、【BeanShell 断言】

-

-

-

-

-

备注

ResponseCode、ResponseMessage 是响应报文的响应码和响应信息,其类型为String

IsSuccess

项目

详细说明

变量名(实例)

IsSuccess

JMeter 变量文档说明

-

适合应用的元件

【BeanShell 取样器】

java.lang.Boolean

-

-

-

-

备注

IsSuccess表示sampler的成功失败,其类型为boolean,如果设置为true,表示”成功“,设置为false,表示”失败“。

Label

项目

详细说明

变量名(实例)

Label

JMeter 变量文档说明

-

适合应用的元件

【BeanShell 取样器】

-

-

-

-

备注

Label是sampler的标题,其类型是String。

FileName

项目

详细说明

变量名(实例)

FileName

JMeter 变量文档说明

-

适合应用的元件

【BeanShell 取样器】

-

-

-

-

备注

1、指的是BeanShell采样器的"脚本文件",相当于一个脚本类型的测试片段

2、如果只输入一个文件名(包括文件后缀),则路径默认是JMeter的bin目录

3、支持输入完整的路径+文件名(包括文件后缀)

4、如果"脚本文件"有值的话,beanshell就执行文件的脚本,benshell内的脚本就不会执行

实例:

1、新建一个filename_script.txt记事本,记事本的内容为

log.info("********** filename script start **********");
vars.put("filename_script","filename script value");
log.info("********** filename script end **********");

2、将记事本filename_script.txt,放置在JMeter的bin目录下,如果是其他路径的话,需要输入完整的路径+文件名(包括文件后缀)

3、在【BeanShell 取样器】的“脚本文件”输入“filename_script.txt”

上面beanshell脚本运行的结果,可以在JMeter的运行日志可以看到。

结论,

1、beanShell脚本的代码没有执行,而执行了filename_script.txt里面的代码。

2、从日志打印中,filename_script.txt里面的代码是JMeter的一个测试片段。

3、FileName指的是filename_script.txt文件

log

项目

详细说明

变量名(实例)

log

JMeter 变量文档说明

Logger (SLF4J javadoc)

适合应用的元件

【BeanShell 取样器】、【BeanShell 预处理程序】、【BeanShell 后置处理程序】、

【BeanShell 断言】、【BeanShell 定时器】、【BeanShell 监听器】

org.apache.log.Logger

public class JMeterContext方法汇总

atDebug(),atError(),atInfo(),atLevel(Level level),atTrace(),atWarn(),debug(Marker marker, String msg),debug(Marker marker, String format, Object... arguments),debug(Marker marker, String format, Object arg),debug(Marker marker, String format, Object arg1, Object arg2),debug(Marker marker, String msg, Throwable t),debug(String msg),debug(String format, Object... arguments),debug(String format, Object arg),debug(String format, Object arg1, Object arg2),debug(String msg, Throwable t),error(Marker marker, String msg),error(Marker marker, String format, Object... arguments),error(Marker marker, String format, Object arg),error(Marker marker, String format, Object arg1, Object arg2),error(Marker marker, String msg, Throwable t),error(String msg),error(String format, Object... arguments),error(String format, Object arg),error(String format, Object arg1, Object arg2),error(String msg, Throwable t),getName(),info(Marker marker, String msg),info(Marker marker, String format, Object... arguments),info(Marker marker, String format, Object arg),info(Marker marker, String format, Object arg1, Object arg2),info(Marker marker, String msg, Throwable t),info(String msg),info(String format, Object... arguments),info(String format, Object arg),info(String format, Object arg1, Object arg2),info(String msg, Throwable t),isDebugEnabled(),isDebugEnabled(Marker marker),isEnabledForLevel(Level level),isErrorEnabled(),isErrorEnabled(Marker marker),isInfoEnabled(),isInfoEnabled(Marker marker),isTraceEnabled(),isTraceEnabled(Marker marker),isWarnEnabled(),isWarnEnabled(Marker marker),makeLoggingEventBuilder(Level level),trace(Marker marker, String msg),trace(Marker marker, String format, Object... argArray),trace(Marker marker, String format, Object arg),trace(Marker marker, String format, Object arg1, Object arg2),trace(Marker marker, String msg, Throwable t),trace(String msg),trace(String format, Object... arguments),trace(String format, Object arg),trace(String format, Object arg1, Object arg2),trace(String msg, Throwable t),warn(Marker marker, String msg),warn(Marker marker, String format, Object... arguments),warn(Marker marker, String format, Object arg),warn(Marker marker, String format, Object arg1, Object arg2),warn(Marker marker, String msg, Throwable t),warn(String msg),warn(String format, Object... arguments),warn(String format, Object arg),warn(String format, Object arg1, Object arg2),warn(String msg, Throwable t)

-

备注

1、日志信息写入到jmeter.log文件

实例:

// 点击“方法汇总” 中info,warn,error只需输入msg的参数
log.info("普通信息  -> 打印ResponseCode = " + ResponseCode);
log.warn("警告信息  -> 打印Label = " + Label);
log.error("出错信息 -> 打印ResponseMessage = " + ResponseMessage);

上面beanshell脚本运行的结果,可以在JMeter的运行日志可以看到。

当我们运行一个项目时,产生很多的日志,这时我们需要分辨出,日志是从哪个beanshell打印出来的。我们使用xxx(String format, Object arg1, Object arg2)这种方法

// 点击“方法汇总” 中info,warn,error输入(String format, Object arg1, Object arg2)的参数的方法。
int infomsg=123456789;
log.info(" 【{}】-> {}", Label, infomsg);
String warnmsg="警告信息内容";
log.warn(" 【{}】-> {}", Label, warnmsg);
String errormsg="出错信息内容";
log.error("【{}】-> {}", Label, errormsg);

上面beanshell脚本运行的结果,可以在JMeter的运行日志可以看到。

sample

项目

详细说明

变量名(实例)

sample

JMeter 变量文档说明

Sampler (Apache JMeter dist API)

适合应用的元件

【BeanShell 预处理程序】

org.apache.jmeter.samplers

public class Sampler方法汇总

支持获取所有取样器的信息,可点击下列取样器获取对应的方法:AbstractSamplerAccessLogSamplerAjpSamplerBaseJMSSamplerBeanShellSamplerBoltSamplerBSFSamplerDebugSamplerFTPSamplerHTTPSamplerHTTPSamplerBaseHTTPSamplerProxyJavaSamplerJDBCSamplerJMSSamplerJSR223SamplerJUnitSamplerLDAPExtSamplerLDAPSamplerMailReaderSamplerMongoScriptSamplerPublisherSamplerSmtpSamplerSubscriberSamplerSystemSamplerTCPSamplerTestActionTransactionSampler

-

备注

可以获取对应取样器(sample)的信息,也可以设置。

prev

项目

详细说明

变量名(实例)

prev

JMeter 变量文档说明

SampleResult (Apache JMeter dist API)

适合应用的元件

【BeanShell 预处理程序】、【BeanShell 后置处理程序】、【BeanShell 定时器】、【BeanShell 监听器】

org.apache.jmeter.samplers.SampleResult

public class JMeterContext方法汇总

同SampleResult

java.lang.Object方法汇总,可以直接用,例如字符串操作中的toString()。

同SampleResult

备注

1、prev和SampleResult是当前sampler的结果,其类型为SampleResult

2、可以读写sampler的信息和控制sampler的行为

关键方法的实例:

try{
  thread.sleep(2000);
}catch(InterruptedException e){
  e.printStackTrace();
}

Failure/FailureMessage

项目

详细说明

变量名(实例)

Failure/FailureMessage

JMeter 变量文档说明

-

适合应用的元件

【BeanShell断言】

public class Sampler方法汇总

-

-

-

备注

1、Failure和FailureMessage是BeanShell Assertion组件独有的内置变量

2、Failure断言是否成功(false为断言成功,true为断言失败),FailureMessage为断言失败描述

SampleLabel

项目

详细说明

变量名(实例)

SampleLabel

JMeter 变量文档说明

-

适合应用的元件

【BeanShell断言】

-

-

-

-

备注

SampleLabel是【BeanShell断言】的标题,其类型是String。

SamplerData

项目

详细说明

变量名(实例)

SamplerData

JMeter 变量文档说明

-

适合应用的元件

【BeanShell断言】

-

-

-

-

备注

SamplerData就是sampler data(请求数据),其类型为byte[ ]

samplerEvent

项目

详细说明

变量名(实例)

samplerEvent

JMeter 变量文档说明

-

适合应用的元件

【BeanShell 监听器】

-

-

-

-

备注

?

bsh.args与Parameters

项目

详细说明

变量名(实例)

bsh.args与Parameters

JMeter 变量文档说明

-

适合应用的元件

【BeanShell 取样器】、【BeanShell 预处理程序】、【BeanShell 后置处理程序】、

【BeanShell 断言】、【BeanShell 定时器】、【BeanShell 监听器】

-

-

-

-

-

备注

1、输入多个参数时,要用空格隔开。

2、Parameters存储的类型是String类型。

3、bsh.args存储的参数的集合,通过bsh.args[n]取对应位置的参数值,但是取出来的参数值也是String类型。

实例:

运行一个简单的例子,就能明白其中的用法。

log.info(" 【{}】-> {}", Label, "bsh.args与Parameters调试starte");
log.info(" 【{}】-> {}", Label, "bsh.args 当前第1个位置参数的value值" + bsh.args[0]);
log.info(" 【{}】-> {}", Label, "bsh.args[0]变量的类型是:" + bsh.args[0].getClass().getSimpleName());

log.info(" 【{}】-> {}", Label, "bsh.args 当前第2个位置参数的value值" + bsh.args[1]);
log.info(" 【{}】-> {}", Label, "bsh.args[1]变量的类型是:" + bsh.args[1].getClass().getSimpleName());

log.info(" 【{}】-> {}", Label, "bsh.args 当前第3个位置参数的value值" + bsh.args[2]);
log.info(" 【{}】-> {}", Label, "bsh.args[2]变量的类型是:" + bsh.args[2].getClass().getSimpleName());

log.info(" 【{}】-> {}", Label, "Parameters变量是个字符串,存储参数的值: " + Parameters);
log.info(" 【{}】-> {}", Label, "bsh.args与Parameters调试end");

上面beanshell脚本运行的结果,可以在JMeter的运行日志可以看到。

从实际的编程中,有很多场景我们并不知道传的参数有多少个。只要稍微的改造一下,也能实现匹配不确定的传参。

进阶传参场景实例:

第一步:

模拟不确定传参的变量场景(可以通过csv文件,用户定义的变量,数据库... ...),本次使用【用户定义的变量】。

第二步:

beanshell参数调用【用户定义的变量】的变量,并且通过上面学习的for循环处理变量。样例如下所示:

log.info(" 【{}】-> {}", Label, "bsh.args与Parameters\"不确定传参\"调试starte");
for(int i = 0; i< bsh.args.length ; i++){
	log.info(" 【{}】-> {}", Label, "bsh.args 当前第"+i+"个位置参数的value值" + bsh.args[i]);
	vars.put("bsh_args"+i, bsh.args[i]);
}
log.info(" 【{}】-> {}", Label, "bsh.args与Parameters\"不确定传参\"调试end");

第三步:

上面beanshell脚本运行的结果

第四步:

通过【调试取样器】检查不确定传参的变量拆分的是否正确。

beanshell总结

如果遇到实际工作中,需要实现复杂的功能,或者研发已经有的功能的话,我们可以和研发沟通同一些,让他们帮忙把他们的功能封装成功一个类或方法,打包成java代码或者jar包甚至是编译后的class文件。我们就可以在beanshell直接引用他们的功能了。

  • 直接输入java代码
  • 导入java文件
  • 导入class文
  • 41
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值