Spring - 反射

反射介绍

Java的反射机制是在运行的状态中,对于任意的一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,能够调用它的任意一个属性和方法,这种动态获取的信息以及动态调用对象的方法的功能成为java语言的反射机制。简单一句话,反射技术可以对类进行解剖。

字节码文件对象获取的三种方式

  1. 有对象,通过 对象.getClass(); 获取
Person p = new Person(); //对象
Class<? extends Person> class1 = p.getClass(); //获取
  1. 有类名,通过 类名.class; 获取
Class<? extends Person> class2 = Person.class;
  1. 有权限定类名,通过 Class.forName("权限定类名"); 获取
Class.forName("com.aishang.java.Person"); //包名+类名

创建对象的五种方式

  1. new 对象
  2. 字节码文件对象.newInstance(); 创建对象
Class clazz = Class.forName("com.aishang.java.Person");
Person person = (Person)clazz.newInstance();
  1. 构造器创建对象 constructor.newInstance("张三",20);
public void fun4() throws Exception{0
			
	Class clazz = Class.forName("com.aishang.java.Person");		
		
		Constructor[] constructors = clazz.getConstructors();	
		for (Constructor constructor : constructors) {
			System.out.println(constructor);
		}
		
	Constructor constructor = clazz.getConstructor(String.class,Integer.class);	
		Person p = (Person)constructor.newInstance("张三",20);
		System.out.println(p.toString());
		}
  1. Object.clone(); 快速创建对象的副本
  2. 反序列化

字段(成员变量)的获取

  1. 获取所有权限的字段
clazz.getDeclaredFields();
  1. 获取所有public权限的字段(成员变量)
clazz.getFields();
  1. 获取任意字段(成员变量)
clazz.getDeclaredField("字段名");
  1. 赋值:如果该字段为私有访问权限则加暴力访问
field.set(对象, 参数);
  1. 暴力访问
field.setAccessible(true);

方法的获取

  1. 获取本类及父类公有的方法
clazz.getMethods();
  1. 获取本类所有方法
clazz.getDeclaredMethods();
  1. 获取私有方法
Object invoke = method.invoke(对象(若为静态方法可为null), 参数列表); //invoke 为返回值
posted @ 2020-11-15 15:16  NoahEavlia  阅读(212)  评论(0编辑  收藏  举报