通过Class对象对类进行操作
一、获取Class对象的三种方式
1.使用Class类的forName()静态方法
forName方法需要传入 包名.类名 的字符串
Class c = Class.forName("exercise.exercise3.Test1");
2.创建类的对象,用对象调用getClass()方法
getClass()方法是继承自java.lang.Object类的方法,因为所有类都继承自Object
Student student = new Student();
Class c2 = student.getClass();
3.调用类的class属性
Class c3 = Student.class;
二、通过对Class对象的操作获取类的信息
Class操作中常见的关键字
Field:表示属性
Method:表示方法
Constructor:表示构造方法
1.获取类的属性
先定义一个类,设置好属性,方法,构造
public class Test1 {
private String name = "小明";
public Integer age = 23;
Boolean tag = true;
protected String grade = "大专";
public Test1(String name, Integer age, Boolean tag, String grade) {
this.name = name;
this.age = age;
this.tag = tag;
this.grade = grade;
}
public Test1() {
}
@Override
public String toString() {
return "Test1{" +
"name='" + name + '\'' +
", age=" + age +
", tag=" + tag +
", grade='" + grade + '\'' +
'}';
}
}
在这里我创建了四个不同类型和不同访问修饰符的属性和有参无参构造,并重写了toString()方法
操作属性的方法:
Class c = Class.forName("exercise.exercise3.Test1");
System.out.println("***************属性**************************");
//获取public的属性
Field[] fields = c.getFields();
//获取所有属性
Field[] declaredFields = c.getDeclaredFields();
//获取指定的公共属性
Field name = c.getField("name");
//获取指定的属性
Field age = c.getDeclaredField("age");
getFields()和getDeclaredFields()方法返回的都是Field[]数组对象,说明他么是返回多个属性,可以通过遍历输出方法数组的name和type
getField()和getDeclaredField()返回的是Field对象,说明是具体的某一个方法
2.获取类的方法
System.out.println("***************方法*********************");
//获取所有公共方法
Method[] methods = c.getMethods();
//获取所有方法
Method[] declaredMethods = c.getDeclaredMethods();
//获取具体的公开的方法
Method getNameMethod = c.getMethod("toString");
//获取具体的方法
Method getNameMethod2 = c.getDeclaredMethod("toString");
和上面同理,getMethods()和getDeclaredMethods()返回Method[]数组对象
getMethod(“toString”)和getDeclaredMethod(“toString”)返回具体的toString()方法
3.获取类的构造方法
System.out.println("********************构造************************");
//获取无参构造方法
Constructor constructor = c.getConstructor();
Constructor constructor = c.getDeclaredConstructor();
//获取有参构造方法
Constructor constructor1 = c.getConstructor(new Class[]{String.class, Integer.class, Boolean.class, String.class});
Constructor constructor1 = c.getDeclaredConstructor(new Class[]{String.class, Integer.class, Boolean.class, String.class});
Constructor getConstructor(Class[] prams)
传入的prams参数为按声明顺序指定该方法参数类型的Class对象的一个数组,要与构造方法参数所指定的参数类型匹配
4.调用类的方法
//调用类的方法
//先调用构造对象(有参无参)的newInstance()方法 实现创建对象
Object obj1 = constructor.newInstance();
Object obj2 = constructor1.newInstance(new Object[]{"答辩", 20, true, "小学"});
//调用Class对象的getMethod()方法获得方法对象,调用方法对象的invoke()方法调用obj的对应方法对象的方法
Method toStringMethod = c.getMethod("toString");
System.out.println(toStringMethod.invoke(obj1));
System.out.println(toStringMethod.invoke(obj2));
以上的这种方法无法调用私有的方法,会抛出NoSuchMethodException异常
(这里我将showInfo()方法设置为私有)
如果要调用private的方法.可以先调用setAccessible()方法,将Method()对象的accessible标志设置为true,表示该方法在访问的时候不会检查访问修饰符(private)
再次运行:showInfo()方法被调用,但是为啥出现null不清楚