Real world examples:
If you create your project using jdesktop 0.8, but submit it with jdesktop 0.9, your code will still use functions 0.9 because it takes advantage of late binding, that is, the code that calls your code is the version the class is loading , regardless of the version with which it was compiled. (This is in contrast to linkers, which insert a version of code with code at compile time into the application.)
For reflection, suppose you are trying to target Java 1.5 and 1.6, but want to use the tab components in 1.6, if available, then check their presence using reflection in the JTabbedPane class to find setTabComponentAt . In this case, you are creating against Java 1.5, which does not have these functions at all, so you cannot call them directly or compile the compilation. However, if you find yourself working against 1.6 on the end-user system (the last action comes into play here), you can use reflection to invoke methods that weren't in 1.5.
They are connected; many applications of reflection rely on late binding to be useful, but they are fundamentally different aspects of the language and its implementation.
source share