下面通过一段代码来引入反射机制的作用。
Interface Function{
void doWork();
}
class functionA implements Function{
@Override
public void doWork(){
System.out.println("functionA");
}
}
class functionB implements Function{
@Override
public void doWork(){
System.out.println("functionB");
}
public static void main(){
Function f = new functionA();//需要执行functionA方法时
//Function f = new functionB();//需要执行functionB方法时
f.doWork();
}
}
以上代码看似很好的解决需要执行不同方法的问题,需要哪个方法只要修改new类型那行代码就可以了。但是这样需要将程序停下了修改,并且重新编译。而对于一个运行中的服务器而言,是不会允许服务器停下了去修改代码的,但是服务器往往需要不断修改。这里就使用到了java的反射机制来进行动态编译。
Interface Function{
void doWork();
}
class functionA implements Function{
@Override
public void doWork(){
System.out.println("functionA");
}
}
class functionB implements Function{
@Override
public void doWork(){
System.out.println("functionB");
}
public static void main(){
try{
String className = getClassNameFromConfig();//从配置文件读取需要的类名
Function f=(Function)Class.forName(className).newInstance();
f.doWork();
}catch (Exception e) {
e.printStackTrace();
}
}
}
由于jvm类加载器会将所有类事先加载进来,使用反射时会去查找当前类是否被加载进来。这样只要修改配置文件中的类名就可以更改需要的类型,不需要重新编译。
网友评论