什么是反射?
反射操作的是Class类型的对象
反射使我们可以在程序运行时获取类信息,动态创建类,获取一个类的成员变量,并调用成员方法,构造方法
java有的时候在编译时无法确定类的类型或者某些信息
其实应该说成
我们故意不将类信息嵌入代码写死,而是写入比如配置文件,从而降低代码耦合这样就不需要改动代码只需要改变配置
而获得这些信息的方法就是反射
实际应用例子:
比如spring在编译时不知道到底要用哪些bean,是运行时通过xml配置或者注解动态获取类型的信息并生成BeanDefinition,接着使用反射创建,管理bean
还有jdbc的驱动也不是写死的,也是我们在运行期间以反射进行加载的
在比如使用Mybatis使用sql语句从数据库查询的字段,如果没有反射我们只能自己编写代码将字段填充到实体类中
而有了反射我们可以在运行时获得实体类的set方法,并调用使用反射调用set方法,从而自动将字段填充到实体类中
只要关闭安全检查就可以通过反射访问私有字段,调用私有方法
Field field=Myclass.getDeclaredField("name");
field.setAccessible(true);//关闭安全检查,同时可以提升性能
field.set(new myclass(), "pkh");
Method[] methods = Myclass.getDeclaredMethods();
methods[0].setAccessible(true);
methods[0].invoke(new myclass());
获取Class对象的三种方法
1.对象实例.getClass()
2.类名.Class()
3.Class.forName(String className)
Class中常见方法
-
获取类名:
– getName() 获取类的名字(全限定名)
– getSimpleName() 获取简单的类名(不含包名,不是全限定名)
-
获取成员变量:
– getFields() 获取类中所有的成员变量
– Field getField(成员变量名字) 获取指定的成员变量
set(Object obj, Object value) obj 给哪个对象的成员变量设置value
get(Object obj) 获取哪个对象该成员变量的值
-
获取构造方法:
– getConstructors() 获取类中所有的构造方法
– getConstructor(该有参构造所需参数) 获取一个类中指定的构造方法
获取Constructor后新建对象:construct.newInstance(“参数”); -
获取成员方法:
– getMethods() 获取类中所有的成员方法
– getMethod(方法名,该方法参数列表) 获取指定方法对象!!!
Method表示成员方法
-
Object invoke(object obj , Object… args),要使用Method对象进行调用,标识在实例obj上以args为参数调用method方法
例: method.invoke(new OneClass(),“参数1”,2);
-
获取实例对象:
– newInstance() 创建实例对象(默认使用空参构造创建对象)
– newInstance(有参构造所需参数) 创建实例对象
-
获得父类Class:getSuperclass(),实现接口:getInterfaces()