Is it definitely a good practice to use it?
What are some possible situations in a project that need reflection?
There are many uses for reflection:
However, one of my favorite uses of reflection is to find properties that have been marked with attributes.
For example, I've written attributes that mark which properties in my classes should be indexed using Lucene. At runtime, I can look at any class, and figure out what fields need to get indexed by just querying the class for "marked" properties.