反射机制:
可以在运行时检查给定类的方法,并返回方法名,即运行时知道类的信息,编译期不需要。典型应用场景:对象序列化和javaBean
相关类:
Class类与java.lang.reflect类库,该类库包含了Field、Method以及Constructor类。这些类型的对象是由JVM在运行时创建的,用于表示未知类里对应的成员。这样你就可以使用Constructor对应的newInstance方法创建新的对象,用get()和set()方法读取和修改Field字段,用invoke()方法调用与Method对象关联的方法。还可以调用getFields、getMethods和getConstructor获取类的字段、方法以及构造器的对象数组。
Tips:
如果操作能不用反射实现,那么最好不使用反射。主要有以下三个方面的原因:
1) 性能——反射机制中类型是动态解析的,所以得不到java VirtualMachine的性能优化,其性能低于不使用反射机制的情况。
2) 安全限制——当程序运行在有安全管控的情形时,反射所需要的运行权限可能不能够被满足。
3) 暴露了类的内部实现——通过反射可以访问到对象的内部私有方法,破坏封装性。
如何使用反射:
1) 获取类对应的Class对象:
Object.getClass()
.class
Class.forName()
GetSuperClass ….
2) 调用获取Construct , Filed, Method的方法
getConstruct(), getFields(),getField(),getMethod(),getMethods()返回Method[] 数组
Method的说明如下:
Reflectiondefines an interface java.lang.reflect.Memberwhich is implemented by java.lang.reflect.Field, java.lang.reflect.Method, and java.lang.reflect.Constructor .
3) 通过返回的Member[]进行操作
即通过Field, Method, Constructor 实现类的相关操作。如获取Field类型,获取Method参数及返回值类型,改变Field值,调用指定Method(Method.invoke)等。
Note:
Class.newInstance() will only succeed ifthe constructor is has zero arguments and is already accessible. Otherwise, itis necessary to use Constructor.newInstance() as in the aboveexample.