Source: https://www.csd.uoc.gr/~hy252/references/JavaReflection.pdf