Java 中的反射是什么意思?有哪些应用场景?
每个类都有⼀个 Class 对象,包含了与类有关的信息。当编译⼀个新类时,会产生一个同名的 .class 文件,该⽂件 内容保存着 Class 对象。类加载相当于 Class 对象的加载,类在第⼀次使用时才动态加载到 JVM 中。也可以使用 Class.forName("com.mysql.jdbc.Driver") 这种方式来控制类的加载,该⽅法会返回⼀个 Class 对象。
反射可以提供运⾏时的类信息,并且这个类可以在运⾏时才加载进来,甚至在编译时期该类的 .class 不存在也可以
加载进来。 Class 和 java.lang.reflect ⼀起对反射提供了⽀持, java.lang.reflect 类库主要包含了以下三个类:
( 1 ) Field :可以使用 get() 和 set() 方法读取和修改 Field 对象关联的字段;
( 2)Method :可以使用 invoke() 方法调用与 Method 对象关联的⽅法;
( 3 ) Constructor :可以用 Constructor 创建新的对象。
应⽤举例:⼯⼚模式,使用反射机制,根据全限定类名获得某个类的 Class 实例。
List < String > list = new ArrayList < String > ();
反射的优缺点?
优点:
运⾏期类型的判断, class.forName() 动态加载类,提高代码的灵活度;
缺点:
尽管反射⾮常强⼤,但也不能滥用。如果⼀个功能可以不用反射完成,那么最好就不⽤。在我们使⽤反射技术时,
下⾯⼏条内容应该牢记于⼼。
( 1 )性能开销 :反射涉及了动态类型的解析,所以 JVM ⽆法对这些代码进行优化。因此,反射操作的效率要⽐那
些⾮反射操作低得多。我们应该避免在经常被执⾏的代码或对性能要求很高的程序中使用反射。
(2)安全限制 :使用反射技术要求程序必须在⼀个没有安全限制的环境中运行。如果⼀个程序必须在有安全限制
的环境中运⾏,如 Applet ,那么这就是个问题了。
( 3)内部暴露:由于反射允许代码执行⼀些在正常情况下不被允许的操作(⽐如:访问私有的属性和⽅法),所
以使⽤反射可能会导致意料之外的副作用,这可能导致代码功能失调并破坏可移植性。反射代码破坏了抽象性,因
此当平台发⽣改变的时候,代码的行为就有可能也随着变化。
Java 中的动态代理是什么?有哪些应用?
动态代理:当想要给实现了某个接口的类中的方法,加⼀些额外的处理。比如说加日志,加事务等。可以给这个类
创建⼀个代理,故名思议就是创建⼀个新的类,这个类不仅包含原来类方法的功能,而且还在原来的基础上添加了
额外处理的新功能。这个代理类并不是定义好的,是动态生成的。具有解耦意义,灵活,扩展性强。
动态代理的应⽤: Spring 的 AOP 、加事务、加权限、加日志。