⚪什么是反射?
反射允许对成员变量,成员方法和构造方法的信息进行编程访问
俗话:(反射就是可以从类中拿东西—成员变量,成员方法,构造方法。就把这些东西挨个拿出来就是反射)
1. 获取class对象的三种方式
1.class.forName(“全类名”);
2.类名.class
3.对象.getClass();
例如项目下有个student类 位于 lianxi.com.Student
//最为常用的
Class clazz1 = Class.forName("lianxi.com.Student");
//一般更多的是当作参数进行传递,例如 锁
Class clazz2 = Student.class;
//当我们已经有了这个类的对象是才可以使用
Student s = new Student();
Class clazz3 = s.getClass();
//输出都是相同的
2.利用反射获取构造方法
Class类中用于获取构造方法的方法
Constructor<?>[] getConstructors() : 返回所有公共构造方法对象的数组
Constructor<?>[] getDeclaredConstructors() : 返回所有构造方法对象的数组
Constructor<T> getConstructor(Class<?>... parameterTypes) : 返回单个公共构造方法对象
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) : 返回单个构造方法对象
例子
public class fanshe {
public static void main(String[] args) throws ClassNotFoundException {
//1.获取class字节码文件对象
Class clazz = Class.forName("student");
//2.获取构造方法
Constructor[] constructor = clazz.getConstructors();
for (Constructor con : constructor) {
System.out.println(con);
}
System.out.println("----------------------------");
Constructor[] constructor2 = clazz.getDeclaredConstructors();
for (Constructor con2 : constructor2) {
System.out.println(con2);
}
}
}
利用反射获取成员变量
Class类中用于获取成员变量的方法
Field[] getFields(): 返回所有 公共 成员变量对象的数组
Field[] getDeclaredFields(): 返回所有成员变量对象的数组
Field getField(String name): 返回单个 公共 成员变量对象
Field getDeclaredField(String name): 返回单个成员变量对象
Field类中用于创建对象的方法
void set(Object obj,Object value): 赋值
Object get(Object obj): 获取值
public class fanshe2 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
//1.获取class字节码文件对象
Class clazz = Class.forName("student");
//2.获取成员变量方法
Field[] fields = clazz.getFields();
for (Field f : fields) {
System.out.println(f); //输出为空,因为写的类里面两个成员变量都是 private 修饰的
}
System.out.println("-------------------------------");
Field[] fields2 = clazz.getDeclaredFields();
for (Field f : fields2) {
System.out.println(f); //输出为空,因为写的类里面两个成员变量都是 private 修饰的
}
System.out.println("--------------------------------");
//获取单个的成员变量
Field age = clazz.getDeclaredField("age");
System.out.println(age);
System.out.println("----------------------------------");
//获取权限修饰符
int modifiers = age.getModifiers();
System.out.println(modifiers);
System.out.println("---------------------");
//获取成员变量的 名字
String a = age.getName(); // 既然已经获得了age了 , 这样写不是多此一举吗???
System.out.println(a);
System.out.println("-----------------------------");
//获取成员变量的 数据类型
Class<?> type = age.getType();
System.out.println(type);
}
}
利用反射获取成员方法
Method[] getMethods() : 返回所有公共构造方法对象的数组
Method[] getDeclaredMethods() : 返回所有构造方法对象的数组
Method getMethod(String name,Class<?>... parameterTypes) : 返回单个公共构造方法对象
Method getDeclaredMethod(String name,Class<?>... parameterTypes) : 返回单个构造方法对象
Method类中用于创建对象的方法
Object invoke(Object obj,Object...args): 运行方法
参数一:用obj对象调用该方法
参数二:调用方法的传递的参数(如果没有就不写)
返回:方法的返回值(没有就不写)
public class fanshe3 {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
//1.获取class字节码文件对象
Class clazz = Class.forName("student");
//2.获取里面所有的方法对象(包含父类中所有的公共方法)
Method[] methods = clazz.getMethods();
for (Method method : methods) {
System.out.println(method);
}
System.out.println("--------------------------");
2.获取里面所有的方法对象(不能获取父类中方法,但是可以获取本类中私有方法)
Method[] methods2 = clazz.getDeclaredMethods();
for (Method method : methods2) {
System.out.println(method);
}
System.out.println("-------------------------------");
Method setAge = clazz.getMethod("setAge", int.class);
System.out.println(setAge);
System.out.println("-------------------------------");
Method getMethod = clazz.getDeclaredMethod("AB", int.class, String.class);
System.out.println(getMethod);
}
}
自己理解总结
第一步永远是 获取class字节码文件对象
第二布 就是通过该字节码文件对象调用相应的方法从而得到我们需要的 成员变量,构造方法,成员方法等等。
反射的作用
⚪ 获取一个类里面所有的信息,获取到了之后再执行其他的业务逻辑
⚪ 结合配置文件,动态的创建对象并调用方法
如何获取构造方法 成员方法 成员变量
get:获取
set:设置
Constructor:构造方法
Field: 成员变量
Method : 方法
Parameter: 参数
Modifiers: 修饰符
Declared : 私有的