Java笔记-反射Reflection
【韩顺平讲Java】Java反射专题 -反射 反射机制 类加载 reflection Class 类结构 等_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
为什么需要反射?
大部分的框架都是基于Java中的反射机制实现的,可以说是反射成就了Java的繁荣。
设想有这样一个场景:通过读取配置文件,创建需要的对象,并调用配置文件中指定的方法。这样我们可以仅仅通过修改配置文件就可以改变业务功能,而不用去改变代码。在这种场景下,就正好可以通过反射来实现。这种场景就经常出现在一些框架的实现中,同时也体现了设计模式中的开闭原则OCP。
是什么?

怎么使用?


| Class cls = Class.forName("com.twg.Cat");
Method m = cls.getMethod("hi"); m.invoke();
Object o = cls.newInstance(); Field f = cls.getField("name"); f.get(o);
cls.getConstructor(); cls.getConstructor(String.class);
|


| method.setAccessible(true);
|
Class类
Class的几种成员方法

| Class<?> cls = Class.forName("com.twg.Car"); System.out.println(cls); System.out.println(cls.getClass()); System.out.println(cls.getPackage().getName());
Car car = (Car)cls.newInstance();
Field brand = cls.getField("barnd"); System.out.println(brand.get(car)); brand.set(car,"奔驰");
Field[] fields = cls.getFields();
|
获取类对象的几种方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| Class.forName("xxx.xxx");
System.out.println(Car.class);
car.getClass();
ClassLoader classLoader = car.getClass().getClassLoader(); Class cls = classLoader.loadClass(classAllPath);
Class cls = int.class;
Class cls = Integer.TYPE;
|
动态加载&静态加载
静态加载:编译时就加载这个类,如果没有就会报错,依赖性太强
动态加载:运行时才加载,降低了依赖性,反射就是动态加载
类加载


加载
将字节码从不同的数据源(class文件、jar包、网络)转化为二进制字节流加载到内存中,并生成该类的java.lang.Class对象。
连接



初始化

获取类的结构信息

反射”爆破”
所谓爆破,就是可以访问到私有的属性或方法。
爆破创建实例
| Constructor con = userClass.getDeclaredConstructor(int.class,String.class); con.setAccessible(true); Object obj = con.newInstance(100,"Bob");
|
爆破操作属性
| Field f = userClass.getDeclaredField("age"); f.setAccessible(true); f.set(对象obj,100); f.get(对象obj);
|
爆破方法
| Method m = userClass.getDeclaredMethod(方法名,XX.class); m.setAccessible(true); Object returnValue = m.invoke(obj,实参列表);
|