一、获取Class对象
1、调用运行时类的 .class 属性
Class stuClass = Student.class;
2、调用运行时类的 getClass 方法
Student s = new Student();
Class stuClass = s.getClass();
3、调用 Class 类的静态方法:forName(String classPath)【该种方法用的多】
Class stuClass = Class.forName("com.example.demo.test.反射.Student");
二、获取字段
1、获取所有公有的字段
Field[] fieldArray = stuClass.getFields();
for (Field f : fieldArray) {
System.out.println(f);
}
2、获取所有的字段(包括私有、受保护、默认的)
fieldArray = stuClass.getDeclaredFields();
for (Field f : fieldArray) {
System.out.println(f);
}
3、获取公有字段 并调用
Field publicField = stuClass.getField("name");
System.out.println("publicField====" + publicField);
4、获取一个对象(产生Student对象--》Student stu = new Student();)
Object obj = stuClass.getConstructor().newInstance();
publicField.set(obj, "彭于晏");
//验证
Student stu = (Student) obj;
System.out.println("验证姓名:" + stu.name);
5、获取私有字段 并调用
Field privateField = stuClass.getDeclaredField("phoneNum");
System.out.println("privateField=====" + privateField);
privateField.setAccessible(true);//暴力反射,解除私有限定
privateField.set(obj, "123456");
System.out.println("验证电话:" + stu);
三、获取方法
1、获取所有公有方法
Method[] methodArray = stuClass.getMethods();
for (Method m : methodArray) {
System.out.println(m);
}
2、获取所有的方法,包括私有的
Method[] methodArray = stuClass.getDeclaredMethods();
for (Method m : methodArray) {
System.out.println(m);
}
3、获取公有的show1()方法
Method m = stuClass.getMethod("show1", String.class);
System.out.println(m);
//实例化一个Student对象
Object obj2 = stuClass.getConstructor().newInstance();
m.invoke(obj2, "刘德华");
4、获取私有的show4()方法
Method m = stuClass.getDeclaredMethod("show4", int.class);
System.out.println(m);
m.setAccessible(true);//解除私有限定
Object result = m.invoke(obj2, 20);//需要两个参数,一个是要调用的对象(获取有反射),一个是实参
System.out.println("返回值:" + result);
class Student {
public String name;
protected int age;
char sex;
private String phoneNum;
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", sex=" + sex + ", phoneNum=" + phoneNum + "]";
}
public Student() {
}
public void show1(String s) {
System.out.println("调用了:公有的,String参数的show1(): s = " + s);
}
protected void show2() {
System.out.println("调用了:受保护的,无参的show2()");
}
void show3() {
System.out.println("调用了:默认的,无参的show3()");
}
private String show4(int age) {
System.out.println("调用了,私有的,并且有返回值的,int参数的show4(): age = " + age);
return "abcd";
}
}