用于在运行时动态的创建对象、调用方法的机制。
比如你用控制台输入一行字符串,然后用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();
看了前面的例子没理由不会吧。。
还能获取什么?
注解 超类 泛型 ....
只有想不到,没有做不到。