目录
场景:今天电话面试被问到反射了,感觉答得一塌糊涂,只答了概念,优缺点没有答出来,记录一下
什么是反射?
Java反射是一种能够在程序运行时动态访问、修改某个类中任意属性和方法的机制(包括private实例和方法)。
java反射机制提供了以下几个功能:
在运行时判断任意一个对象所属的类;
在运行时获取任意一个类的对象;
在运行时获取任意一个类所具有的成员变量和方法;
反射的优缺点是什么?
优点:
1.增加程序的灵活性,避免将程序写死到代码里。
例:定义了一个接口,实现这个接口的类有20个,程序里用到了这个实现类的地方有好多地方,如果不使用配置文件手写的话,代码的改动量很大,因为每个地方都要改而且不容易定位,如果你在编写之前先将接口与实现类的写在配置文件里,下次只需改配置文件,利用反射(java API已经封装好了,直接用就可以用 Class.newInstance())就可完成。
2.代码简洁,提高代码的复用率,外部调用方便
package cn.yonyong.reflection.testdemo;
interface Fruit { //水果接口
public void eat() ; //吃水果
}
class Apple implements Fruit{ //定义苹果
public void eat() {
System.out.println("**吃苹果。");
}
}
class Orange implements Fruit{
public void eat() {
System.out.println("**吃橘子。");
}
}
class Factory{
public static Fruit getInstance(String className){
Fruit fruit = null ;
try{
fruit = (Fruit) Class.forName(className).newInstance() ;
}catch(Exception e ){
e.printStackTrace() ;
}
return fruit ;
}
}
public class FactoryDemo{
public static void main(String args[]){
//通过工厂类取得接口实例,传入完整的包.类名称
Fruit f = Factory.getInstance("cn.yonyong.reflection.testdemo.Apple") ;
if(f!=null){ //判断是否取得接口实例
f.eat() ;
}
}
}
1.性能问题
使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此Java反射机制主要应用在对灵活性和扩展性要求很高的系统框架上,普通程序不建议使用。
反射包括了一些动态类型,所以JVM无法对这些代码进行优化。因此,反射操作的效率要比那些非反射操作低得多。我们应该避免在经常被 执行的代码或对性能要求很高的程序中使用反射。
3.安全限制
反射有那些应用?
spring中bean的配置,通过配置类获取该类的对象
springBoot中自动配置的加载
获取数据库的驱动也是采用反射‘
tomcat服务器(有时间需要系统学习一下)
参考:https://blog.csdn.net/weixin_33256071/article/details/114165749