反射
获取Class
//法一,对象.getClass,不适用于int等基础类型
Class clazz = new Person().getClass
//法二,.Class
Class clazz = Person.Class
//法三,包名
try {
Class clazz = Class.forName("com.android.test.Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Class内容清单获取
获取Name
/**
* 获取类型限定类名,例如:
* 引用类Person => com.android.text.Person
* 内部类 => com.frank.test.Outter$Inner
* 基础类型int => int
* 数组string[][] => [[Ljava.lang.String
**/
clazz.getName();
/**
* 获取类型名,例如:
* 引用类Person => Person
* 内部类 => Inner
* 匿名内部类 => 空
* 基础类型int => int
* 数组string[][] => String[][]
**/
Class.getSimpleName();
/**
* 获取对象的官方名字,也是全限定类名,例如:
* 引用类Person => com.android.text.Person
* 内部类 => com.frank.test.Outter.Inner
* 匿名内部类 => null
* 局部类 => null
* 基础类型int => int
* 数组string[][] => Ljava.lang.String[][]
**/
Class.getCanonicalName();
获取修饰符
四大类:限制作用域(public等)、abstract、static、注解
类修饰符是通过一个int来记录的,Person.class.getModifiers()即可获得 如1025之类的数字,它就记录着该类的修饰符,可通过Modifier来解读Modifier.toString(TestModifier.class.getModifiers())即可打印出该类的修饰符
获取Class的Field(成员属性)、Method(方法)、Constructor(构造器)
获取Field
//获取所有的属性,但不包括从父类继承下来的属性
Field[] getDeclaredFields()
//获取自身的所有的 public 属性,包括从父类继承下来的。
Field[] getFields()
//获取Method
Method getDeclaredMethod(String name, Class<?>... parameterTypes)
Method getMethod(String name, Class<?>... parameterTypes)
Method[] getDeclaredMethods()
Method getMethod(String name, Class<?>... parameterTypes)
//获取Constructor,因为Constructor无法从父类继承,所以无法获取父类的Constructor
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
Constructor<T> getConstructor(Class<?>... parameterTypes)
Constructor<?>[] getDeclaredConstructors()
Constructor<?>[] getConstructors()
Filed Method Contructor 的 操控
Field
//获取变量名 mPerson
getName()
//获取详细类型名 java.util.List<com.android.test.Person>
Type getGenericType()
//获取类型名 java.util.List
Class<?> getType
//修饰符获取,与Class的雷同
int getModifiers()
//实例化一个对象
Person person = (Person)Person.class.newInstance();
Person clazz = Person.class
Field name = clazz.getField("name");
//如果访问的Field是private的则还需要如下设置
name.setAccessible(true);
//内容获取,Field提供了各种get方法
name.getString(person);
//内容赋值,Field提供了各种set方法
name.setString(person,"huangshunbo");
Method
//获取方法名
getName()
//获取修饰符
getModifiers()
//获取所有参数
Parameter[] getParameters()
//获取所有的参数类型
Class<?>[] getParameterTypes()
//获取所有的参数类型,包括泛型
Type[] getGenericParameterTypes()
//获取返回值类型
Class<?> getReturnType()
//获取返回值类型包括泛型
Type getGenericReturnType()
//获取异常类型
Class<?>[] getExceptionTypes()
Type[] getGenericxceptionTypes()
//执行方法
invoke(Object obj,Object... args)
Parameter操作
//获取参数名字
getName
//获取参数类型
Class<?> getType()
//获取参数的修饰符
int getModifiers()
Constructor
//创建实例Class.newInstance()和Constructor.newInstance()
//Class.newInstance() 只能