There are some tools and techniques that allow to do things comparable to what Java/.NET reflection APIs provide.
- for inspecting current loaded/running BEAM applications use functions from elixir
Applicationmodule (e.g.Application.all_started/0) - for working with loaded/complied module use erlang
:code, e.g. `:code.all_loaded/0’ - to fetch all functions/macros/callbacks of a given module use builtin functions
__info__/1,module_info/0,1, `behaviour_info/1 - Protocols provide some info by means of
__protocol__/1,impl_for/1,impl_for!/1functions - Struct can be converted to map with
Map.from_struct/1- use that to inspect/iterate over fields - Map can be converted to struct by putting special key e.g.
Map.put(my_map, :__struct__, MyModule) - It is possible to generate code and compile modules on the fly (look into
Code) - module alias is just an atom, you can generate it in the runtime by format string expressions, e.g.
:"Elixir.My.#{prefix}Module" - you can invoke any function with
apply - use
Code.fetch_docsto query documentation - use
Code.Typespec.fetch_specs/callbacks/typesto query dialyzer specs (warning - private API) - use macros and
Macro.pre/postwalkto generate/transform AST






















