Nicoslav

Nicoslav

Reflection in Elixir

Which are the most common ways to do Reflection in Elixir? Especially Object-Analysis and Class-Analysis would be nice to know since there isn’t really anything available in the internet towards this topic.
Thank you guys in advance!

Most Liked

lukaszsamson

lukaszsamson

ElixirLS Core Team

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 Application module (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!/1 functions
  • 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_docs to query documentation
  • use Code.Typespec.fetch_specs/callbacks/types to query dialyzer specs (warning - private API)
  • use macros and Macro.pre/postwalk to generate/transform AST
10
Post #8
gregvaughn

gregvaughn

The closest thing I think of to Java reflection is the __info__/1 (Module — Elixir v1.8.1) function defined on each module. It lets you find out what function/arity are exported by each module, plus other metadata.

benwilson512

benwilson512

Author of Craft GraphQL APIs in Elixir with Absinthe

Reflection in Java is generally focused on classes, and since Elixir does not have classes or objects, there is nothing particularly equivalent to Java reflection at all.

Keep in mind, reflection is a tool that exists to solve problems a particular way. Elixir is an entirely different approach to programming than Java, and so it has entirely different tools. The best way to learn Elixir is on its own terms, and not try too hard to find Java equivalents.

Last Post!

dimitarvp

dimitarvp

The closest thing to reflection in Erlang/Elixir (and all BEAM languages) are the apply/2 and apply/3 functions.

That being said, I completely agree with @benwilson512 – learn functional programming and Elixir itself and you will find several alternatives that might even work better for your use case.

Where Next?

Popular in Questions Top

JeremM34
Hello, how can I check the Phoenix version ? Thanks !
New
hariharasudhan94
Lets say I have map like this fetching from my database %{"_id" => #BSON.ObjectId<58eb1a7a9ad169198c3dXXXX>, "email" => ...
New
skosch
To my knowledge, put_in, Map.update etc. all have the one limitation of not automatically creating intermediate keys when needed (for exa...
New
Lily
In templates/appointment/index.html.eex: <%= for appointment <- @appointments do %> <tr> <td><%= appoi...
New
Darmani72
If I have a post route which an argument: post /my_post_route/:my_param1, MyController.my_post_handler How would get the post params ...
New
greenz1
I have a phoenix application from which a user can download multiple(5-6) files of size 1MB. I couldn’t find anything related to sending ...
New
sergio_101
I am VERY much an elixir newbie. I have taken one elixir course and one phoenix course on Udemy. During that course, I saw the instructor...
New

Other popular topics Top

vonH
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New
jononomo
For some reason my phoenix channels are working for me in my local dev environment, but as soon as I deploy via Docker, I get a 403 error...
New
aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
siddhant3030
Hi, I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New
saif
Hello everyone, Long time lurker first time poster here. I’ve recently begun working on Elixir full-time again! :raised_hands: It’s been...
New
dblack
I’ve got an issue with an app and I’ve no idea of how to troubleshoot it. I’m hoping someone here might have seen something similar. I p...
New

We're in Beta

About us Mission Statement