> Erlang中文手册 > load_module/2 加载一个模块的目标 BEAM 代码

erlang:load_module/2

加载一个模块的目标 BEAM 代码

用法:

load_module(Module, Binary) -> {module, Module} | {error, Reason}

如果 Binary 包含着模块 Module 的目标 BEAM 代码,那么这个内置函数(BIF)会加载这些目标代码。如果模块 Module 的目标代码已经存在,那么模块所有的对外引用接口都会被替换成新加载代码里的。之前加载的代码将作为就代码保存在系统里,因为也许还有进程还用那些代码在运行着。如果加载成功,则返回 {module, Module},否则返回 {error, Reason}。

Reason 的选项:

  • badfile:Binary 是一个错误格式的目标代码
  • not_purged:模块的目标代码 Binary 不能被加载,因为该模块的旧代码已经存在
  • badfile:Binary是另外一个模块的目标代码
{ok, Module} = application:get_application(),
case code:get_object_code(Module) of
    {Module, Binary, _Filename} ->
        erlang:load_module(Module, Binary);
    GetObjectCodeError ->
        GetObjectCodeError
end.
{ok, Module} = application:get_application(),
case code:get_object_code(Module) of
    {_Module, Binary, _Filename} ->
        {ok, {_, [{abstract_code, {_, AbstractCode}}]}} = beam_lib:chunks(Binary, [abstract_code]),
        io:format("~s~n", [erl_prettypr:format(erl_syntax:form_list(AbstractCode))]);
    GetObjectCodeError ->
        GetObjectCodeError
end.