Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法功能称为Java语言的反射机制。
如果我们动态获取到这些信息,我们需要依靠Class对象。Class类对象将一个类的方法、变量等信息告诉运行的程序。
1.如果指定具体类的情况下可以使用
Class alunbarClass = TargetObject.class;
但是我们一般是不知道具体类的,基本都是通过遍历包下面的类来获取Class对象。
2.通过Class.forName()传入类的路径获取
Class alunbarClass1 = Class.forName("cn.javaguidde.TargetObject");
3.根据对象获取
Person p = new Person();
Class c = p.getClass();
静态编译:编译时确定类型,绑定对象
动态编译:运行时确定类型,绑定对象
优点:运行期间判断类型,动态加载类,提高代码灵活度
缺点:
1.性能瓶颈:
反射相当于一系列解释操作,通知JVM要做的事情,性能比直接的Java代码要慢很多
2.安全问题:
让我们可以动态操作改变类的属性同时也增加了类的安全隐患。
1.我们在使用JDBC连接数据库时使用class.forName()通过反射加载数据库的驱动程序
2.Spring框架的IOC(动态加载管理Bean)创建对象以及AOP功能都和反射有联系
3.动态配置实例的属性
1.new只能用于编译期就能确定的类型,私有属性外部不能访问。而反射可以在运行时才确定类型并创建对象。私有属性外部可以访问,增加了灵活性。
2.解耦合。比如你写一个DAO接口,就不需要每次都new一个实例,只需要在配置时候写好交给Spring,然后在要使用的时候拿出来就可以了。
new实例化和反射实例化有什么区别?
Reflection:Java反射机制的应用场景
https://segmentfault.com/a/1190000010162647?utm_source=tuicool&utm_medium=referral
Java基础之—反射(非常重要)
https://blog.csdn.net/sinat_38259539/article/details/71799078