一.获取Class对象
1.使用类的class属性来获取该类对应的Class对象
//方法一
Class<Student> studentClass = Student.class;
System.out.println(studentClass);
运行结果:
2.调用对象的getClass()方法
//方法二
Student student = new Student();
Class<? extends Student> studentClass2 = student.getClass();
System.out.println(studentClass2);
运行结果:
3.Class类中的静态方法forName(String className)
//方法三
Class<?> studentClass3 = Class.forName("com.reflection.Student");
System.out.println(studentClass3);
运行结果:
二.反射获取构造方法并使用
1.获取公共的构造方法(通过getConstructors方法)
Class<?> aClass = Class.forName("com.reflection.Student");
Constructor<?>[] constructors = aClass.getConstructors();
for (Constructor<?> constructor : constructors) {
System.out.println(constructor);
}
System.out.println("----------");
运行结果:
2.获取所有的构造方法(通过getDeclaredConstructors方法)
Class<?> aClass = Class.forName("com.reflection.Student");
Constructor<?>[] declaredConstructors = aClass.getDeclaredConstructors();
for (Constructor<?> declaredConstructor : declaredConstructors) {
System.out.println(declaredConstructor);
}
运行结果:
3.获取单个公共的构造方法(通过参数的类型来匹配对应的构造方法)
Class<?> aClass = Class.forName("com.reflection.Student");
Constructor<?> constructor = aClass.getConstructor(String.class, Integer.class, String.class);
System.out.println(constructor);
运行结果:
4. 获取单个构造方法
//获取单个构造方法
Class<?> aClass = Class.forName("com.reflection.Student");
Constructor<?> constructor = aClass.getDeclaredConstructor(String.class, Integer.class);
System.out.println(constructor);
运行结果
5.通过构造方法创建对象(通过调用Constructor类中的newInstance方法实列化对象)
//获取单个构造方法
Class<?> aClass = Class.forName("com.reflection.Student");
Constructor<?> constructor = aClass.getDeclaredConstructor(String.class, Integer.class);
System.out.println(constructor);
运行结果:
三.获取成员变量并使用
1.获取所有的公共成员变量数组
Class<?> aClass = Class.forName("com.reflection.Student");
Field[] fields = aClass.getFields();
for (Field field : fields) {
System.out.println(field);
}
运行结果:
2.获取所有的成员变量数组
Class<?> aClass = Class.forName("com.reflection.Student");
Field[] fields = aClass.getDeclaredFields();
for (Field field : fields) {
System.out.println(field);
}
运行结果:
3..获取单个公共成员变量
Class<?> aClass = Class.forName("com.reflection.Student");
Field weight = aClass.getField("weight");
Field height = aClass.getField("height");
System.out.println(weight);
System.out.println(height);
运行结果:
4.获取单个成员变量
Class<?> aClass = Class.forName("com.reflection.Student");
Field weight = aClass.getDeclaredField("weight");
Field height = aClass.getDeclaredField("name");
Field age = aClass.getDeclaredField("age");
System.out.println(weight);
System.out.println(height);
System.out.println(age);
运行结果:
5.给object对象赋值
//获取class对象
Class<?> aClass = Class.forName("com.reflection.Student");
//对象实列化(调用无参构造方法)
Constructor<?> constructor = aClass.getConstructor();
Object o = constructor.newInstance();
// 获取成员变量
Field name = aClass.getDeclaredField("name");
// private类型的变量无法直接赋值
// 通过setAccessible方法 暴力反射 ,使程序在运行时逃过检测
name.setAccessible(true);
// 对Object对象进行赋值
name.set(o,"张三丰");
Field age = aClass.getDeclaredField("age");
age.setAccessible(true);
age.set(o,33);
Field height = aClass.getDeclaredField("height");
height.set(o,178.5F);
System.out.println(o);
运行结果:
四.获取方法并使用
1.获取所有的公共方法数组(包括继承)
Class<?> aClass = Class.forName("com.reflection.Student");
Method[] methods = aClass.getMethods();
for (Method method : methods) {
System.out.println(method);
}
运行结果:
2.获取所有的方法数组(不包括继承)
//获取所有成员变量
Class<?> aClass = Class.forName("com.reflection.Student");
Method[] methods = aClass.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method);
}
运行结果:
3..获取单个公共方法并使用
//获取单个公共成员变量
Class<?> aClass = Class.forName("com.reflection.Student");
Constructor<?> constructor = aClass.getConstructor();
Object o = constructor.newInstance();
Method teach = aClass.getMethod("teach", String.class);
teach.invoke(o,"王二麻子");
运行结果:
4.获取单个方法
//获取单个成员变量
Class<?> aClass = Class.forName("com.reflection.Student");
Constructor<?> constructor = aClass.getConstructor();
Object o = constructor.newInstance();
Method study = aClass.getDeclaredMethod("study");
// private类型需要使用暴力反射逃过运行检测
study.setAccessible(true);
study.invoke(o);
运行结果: