反射、Class类、Field类、Method类
反射
Class类
Class类没有公共构造方法,所有创建Class的对象的方法有以下几种:
1.通过Class.forName()静态方法返回Class类的一个实例
Class cls = Class.forName("cn.gzsxt.test.Dog");
2.通过类名.class来获取一个Class类的实例
cls = Dog.class;
3.代码运行在非静态区,通过this.getClass()获取Class类的一个实例
Class cls = this.getClass();
Class类是对所有类的一个抽象,Class对象是用来对一个类进行描述
类的属性
获取类名
System.out.println(cls.getName());
获取类的修饰限定符
int modifiers = cls.getModifiers();
获取一个类的属性
1.根据一个属性名获取一个public属性的描述
Field field = cls.getField("属性名");
2.获取一个类的全部public属性的描述
Field[] fields = cls.getFields();
3.根据一个属性名获取一个在类中声明的属性的描述
Field declaredField = cls.getDeclaredField("属性名");
4.获取所有在类中声明的属性的描述
Field[] declaredFields = cls.getDeclaredFields();
获取一个类的方法
1.根据一个方法的名字获取类中的一个public的方法的描述
Method method = cls.getMethod("方法名", ...参数类型);
2.获取所有在类中是public的方法的描述
Method[] methods = cls.getMethods();
3.根据一个方法名获取在类中声明的一个方法的描述
Method method = cls.getDeclaredMethod(方法名, ...参数类型);
4.获取所有在类中声明的方法的描述
Method[] declaredMethods = cls.getDeclaredMethods();
通过反射创建一个对象
Object object = cls.newInstance();
Field
获取属性的名字
System.out.println(field.getName());
获取属性的类型
Class strcls = field.getType();
System.out.println(strcls.getName());
获取属性的限定符
int modifiers = field.getModifiers();
System.out.println(modifiers);
暴力设置:设置field的访问
field.setAccessible(true);
有d对象,希望给d对象的gender属性赋值,可以使用set方法
field.set(d, "公");
返回d对象的gender属性的值,可以使用get方法
System.out.println(field.get(d));
Method
获取方法名
System.out.println(method.getName());
方法的返回值类型
Class returnType = method.getReturnType();
System.out.println(returnType.getName());
方法的参数类型
Class[] paraType = method.getParameterTypes();
for (int i = 0; i < paraType.length; i++) {
System.out.println(paraType[i].getName());
}
获取方法的修饰符
int modifiers = method.getModifiers();
方法是可以执行的,使用invoke执行method对象所表示的方法
method.invoke(d, null);