问六:说说反射吧?
Class类
JAVA除了基础类型外其他都是class(本质就是数据类型)(可以把interface看做广义上的class),JVM为每个加载的class创建唯一的Class实例(正因如此,可以用==判断Class实例是否相同)
class/interface的数据类型是Class
Class实例包含该class的所有信息,通过Class实例获取class信息的方法称为反射(Reflection)
获取一个class的Class实例:
Class cls = String.class;
Class cls = "str".getClass();
Class cls = Class.forName("java.lang.String");
注意Class的==比较和instanceof的区别
== 只能判断是否为同一类型
instanceof 可以判断是否为同一家族的(即是否为父子继承关系或同一级)
从Class实例获取class信息:
getName()
getSimpleName()
getPackage()
从Class实例判断class类型:
isInterface()
isEnum()
isArray()
isPrimitive()
创建class实例:
cls.newInstance()
JVM总是动态加载class,可以在运行期根据条件控制加载class
访问字段Field
通过Class实例获取字段field信息:
getField(name) 获取某个public的field(包括父类)
getDeclaredField(name) 获取当前类的某个field(不包括父类)【如果是非public的,则需要setAccess】
getFields() 获取所有public的field(包括父类)
getDeclaredFields() 获取当前类的所有field(不包括父类)
所有和某个的意思都是不管是什么访问权限都能访问(比如private)[同]
Field对象包含一个field的所有信息:
getName()
getType()
getModifiers()
获取和设置field的值:
get(Object obj)
set(Object, Object)
通过反射访问Field需要通过SecurityManager设置的规则,也就是说反射访问字段可能会失败
通过设置setAccessible(true)来访问非public字段
调用方法Method
通过Class实例获取方法Method信息:
getMethod(name, Class...) 获取某个public的method(包括父类)
getDeclaredMethod(name, Class...) 获取当前类的某个method(不包括父类)
getMethods() 获取所有public的method(包括父类)
getDeclaredMethods() 获取当前类的所有method(不包括父类)
Method对象包含一个method的所有信息:
getName()
getReturnType()
getParameterTypes()
getModifiers()
调用Method:
Object invoke(Object obj, Object... args)
通过设置setAccessible(true)来访问非public方法
反射调用Method也遵守多态的规则
实际上在当我们在父类获取一个方法后,传入的实例是子类,实际上执行的是子类覆写父类的方法
调用构造方法Constructor
调用public无参数构造方法 Class.newInstance()
例如:String s = (String) String.class.newInstance();
通过Class实例获取Constructor信息:
getConstructor(Class...) 获取某个public的Constructor
getDeclaredConstructor(Class...) 获取某个Constructor
getConstructors() 获取所有public的Constructor
getDeclaredConstructors() 获取所有Constructor
通过Constructor实例可以创建一个实例对象:
newInstance(Object… parameters)
通过设置setAccessible(true)来访问非public构造方法(和上面的一样,也有可能失败)
获取继承关系
获取父类的Class:
Class getSuperclass()
Object的父类是null
interface的父类是null
获取当前类直接实现的interface:Class[] getInterfaces()不包括间接实现的interface
没有interface的class返回空数组
interface返回继承的interface
判断一个向上转型是否成立:bool isAssignableFrom(Class)