反射(Java)
什么是反射?
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
理解Reflect
- 反射
- 反转
理解为控制反转,权力的反转:
每一个人都有活着的权力,行动和自由的权力;每一个类都有创建对象,调用属性和方法的权力。现在将类的这些权力转交给Class对象,让它来帮助某个类去完成这些操作。
理解class
每一个实体类都会被编译成字节码文件,java眼中万事万物都是对象,那么天下所有的字节码文件都可以看成是对象,谁的对象呢? 当然得有一个类,来代表所有的字节码文件,这个类就是Class类。
反射功能
- 三种方式获取Class对象
@Test//获取Class --范围:所有的字节码文件
public void test1() throws ClassNotFoundException {
//方式1--通过类名
Class c=Dog.class;//Dog.java编译后的字节码文件
Class c1=Book.class;//Book.java编译后的字节码文件
//方式2--通过对象
Class c3 = new Dog().getClass();
//方式3--通过类路径
Class c4 = Class.forName("reflect1.Book");
}
- 管理构造方法
//1.管理无参构造
@Test
public void test2() throws Exception {
//1.获取到某个类的字节码文件对象,即Class的对象
Class<Dog> c = Dog.class;
//2.帮Dog调用无参构造
Dog dog = c.newInstance();
System.out.println(dog);
}
//2.管理有参构造
@Test
public void test3() throws Exception {
//1.获取到某个类的字节码文件对象,即Class的对象
Class<Dog> c = Dog.class;
//2.获取有参构造的管理对象--2个参数的那个
Constructor<Dog> con = c.getDeclaredConstructor(String.class,int.class);
//3.帮助Dog类调用有参构造
Dog dog = con.newInstance("旺财",2);
System.out.println(dog);
}
- 管理属性
//3.管理属性
@Test
public void test4() throws Exception {
//1.获取到某个类的字节码文件对象,即Class的对象
Class<Dog> c = Dog.class;
//2.获取某个属性的管理对象
Field f = c.getDeclaredField("name");
//先创建一个狗狗对象
Dog dog = c.newInstance();
f.setAccessible(true);//开启私有属性操作权限
//3.帮助dog给name属性赋值
f.set(dog,"来福");
System.out.println(dog);
}
- 管理方法
//4.管理方法
@Test
public void test5() throws Exception {
//1.获取到某个类的字节码文件对象,即Class的对象
Class<Dog> c = Dog.class;
//2.获取某个方法setAge(int age)的管理对象
Method m = c.getDeclaredMethod("setAge", int.class);
//先创建一个狗狗对象
Dog dog = c.newInstance();
//3.帮助dog给调用setAge方法
m.invoke(dog,3);
//System.out.println(dog);
//管理toString方法
Method m2 = c.getDeclaredMethod("toString");
System.out.println(m2.invoke(dog));
}
理解不是关键,理解+练习才是最重要的!
留下个赞再走呗!