首页 > 应用开发 > Java > java编译器的一些感悟
为了准备面试最近复习和深入学习了向上/下转型,泛型,可变参数,发现,我们很多时候,这些语法特性都是在编译器层面的:编译器会背地里将我们的诸如此类的语法转化成为符合解释器的格式,所以等到达解析器执行时已经是常规格式的机器码。例如,泛型的话编译器会通过擦除(erasure)的前端处理,固定上、下限等操作令我们写的源码变回我们的常规代码;可变参数的话,编译器背地里就自动将匹配好的参数装到一个数组中,于是又变回了我们的常规代码。在编码中,正式由于编译器的这些“背地里”的行为,我们可以发明很多很好的设计模式,例如向上转型在工厂模式,动态代理等中起到的核心作用。
上述的都是编译器的层面的特性,于是,很容易联想到:如果我们能够绕过编译器的话,就可以做到很多不符合语法特性的事。例如,泛型:通过反射来绕过编译器。
举个例子:
public
class Info{
public static void main(String[] args){
List<String> list_str =
new ArrayList<String>();
list_str.add(“apple”);
list_str.add(“orange”);
//list_str.add(new Object());//编译错误
//利用反射,可以绕过编译器,因为反射是runtime的行为而非编译期的行为:
try {
list_str.getClass().getMethod("add", Object.class).invoke(list_str, new Object());
} catch (IllegalAccessException |
IllegalArgumentException
| InvocationTargetException
| NoSuchMethodException
| SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
类似的案例还有很多。
呜呼!其实我们很多时候都是在和编译器在博弈而已。。。。。。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29900383/viewspace-1735710/ ,如需转载,请注明出处,否则将追究法律责任。