用于在运行时动态的创建对象、调用方法的机制。
比如你用控制台输入一行字符串,然后用Class.forName方法创造一个对象。(当然更多是从配置文件读取)

Class类

用以描述Java应用程序中的类和接口。这个类没有公有的构造方法。这个类的对象由JVM生成,本质上就是加载到内存里的运行时类。

获取Class对象的方式

1 xxx类.class
2 xxx类型的对象.getClass()
3 包装类型.Type (获得的是拆箱后的类型)
4 Class.forName(str) (会有异常,另外类名要加上包名,比如java.lang.String)
5 用classloader

ClassLoader classLoader = ClassLoader.getSystemClassLoader();
Class<?> aClass = classLoader.loadClass("java.lang.String");
System.out.println(aClass);

用反射动态创建一个对象

Class c1 = Class.forName("Person");
Constructor constructor = c1.getConstructor();
Object o = constructor.newInstance();
Constructor constructor1 = c1.getConstructor(String.class, int.class);    //假设Person类有个String,int的构造器
Object o1 = constructor1.newInstance("张飞", 30);

用反射获取私有构造器

declaredConstructor.setAccessible(true);
Object o = declaredConstructor.newInstance();

用反射获取属性(私有的)

Class c1 = Class.forName("Person");
Constructor constructor1 = c1.getConstructor(String.class, int.class);
Object o1 = constructor1.newInstance("张飞", 30);
Field name = c1.getDeclaredField("name");
name.setAccessible(true);    //设置这个才能用访问私有属性
System.out.println(name.get(o1));
name.set(o1, "关羽");
System.out.println(name.get(o1));

用反射获取方法

class对象.getMethod();
看了前面的例子没理由不会吧。。

还能获取什么?

注解 超类 泛型 ....
只有想不到,没有做不到。