反射:
原理如下:
获取Class对象的三种⽅式:
1.通过类名.class获取;
2. 通过Object类的成员⽅法getClass()⽅法获取;
3.通过Class.forName(“全限定类名”)⽅法获取;
获取Class对象的信息:
1.String getSimpleName(); 获得简单类名,只是类名,没有包
2.String getName(); 获取完整类名,包含包名+类名
获取Class对象的Constructor信息
-
Constructor getConstructor(Class… parameterTypes)
根据参数类型获取构造⽅法对象,只能获得public修饰的构造⽅法。
如果不存在对应的构造⽅法,则会抛出 java.lang.NoSuchMethodException 异常。 -
Constructor getDeclaredConstructor(Class… parameterTypes)
根据参数类型获取构造⽅法对象,包括private修饰的构造⽅法。
如果不存在对应的构造⽅法,则会抛出 java.lang.NoSuchMethodException 异常。 -
Constructor[] getConstructors()
获取所有的public修饰的构造⽅法 -
Constructor[] getDeclaredConstructors()
获取所有构造⽅法,包括privat修饰的
Constructor类中常⽤⽅法
- T newInstance(Object… initargs)
根据指定参数创建对象。 - void setAccessible(true)
暴⼒反射,设置为可以直接访问私有类型的构造⽅法。
获取Class对象的Method信息
-
Method getMethod(“⽅法名”, ⽅法的参数类型… 类型)
根据⽅法名和参数类型获得⼀个⽅法对象,只能是获取public修饰的 -
Method getDeclaredMethod(“⽅法名”, ⽅法的参数类型… 类型)
根据⽅法名和参数类型获得⼀个⽅法对象,包括private修饰的 -
Method[] getMethods()
获取所有的public修饰的成员⽅法,包括⽗类中。 -
Method[] getDeclaredMethods()
获取当前类中所有的⽅法,包含私有的,不包括⽗类中。
Method类中常⽤⽅法
-
Object invoke(Object obj, Object… args)
根据参数args调⽤对象obj的该成员⽅法
如果obj=null,则表示该⽅法是静态⽅法 -
void setAccessible(boolean flag)
暴⼒反射,设置为可以直接调⽤私有修饰的成员⽅法;
获取Class对象的Field信息
Field是属性类,类中的每⼀个属性(成员变量)都是Field的对象,通过Field对象可以给对应的成员变量赋
值和取值。
-
Field getDeclaredField(String name)
根据属性名获得属性对象,包括private修饰的 -
Field getField(String name)
根据属性名获得属性对象,只能获取public修饰的 -
Field[] getFields()
获取所有的public修饰的属性对象,返回数组。 -
Field[] getDeclaredFields()
获取所有的属性对象,包括private修饰的,返回数组。
Field类中常⽤⽅法
void set(Object obj, Object value)
void setInt(Object obj, int i)
void setLong(Object obj, long l)
void setBoolean(Object obj, boolean z)
void setDouble(Object obj, double d)
Object get(Object obj)
int getInt(Object obj)
long getLong(Object obj)
boolean getBoolean(Object ob)
double getDouble(Object obj)
void setAccessible(true);暴⼒反射,设置为可以直接访问私有类型的属性。
Class getType(); 获取属性的类型,返回Class对象。