Java是否有任何隐式的反射用法?

时间:2019-01-06 20:28:31

标签: java

前一天,我接受了一次采访,有人问我开发人员是否经常使用反思?我说过,我只是在学习反射本身时才使用它,我不知道在Java中对其的任何“隐藏”用法。

我忘了以后再问我的面试官。但是,在任何情况下,都使用反射并且对开发人员来说并不明显吗?

3 个答案:

答案 0 :(得分:2)

好吧,AOP是反射的常见用例之一,可以解决横切问题。

例如,Spring AOP在反射包中使用动态代理在某些情况下实现了缓存,事务边界管理,异常处理,执行异步方法等的实现。

答案 1 :(得分:1)

This answer认为instanceof是反思,因为:

  

程序观察[值]的结构并进行类型自省。

通过相同的参数,选中的强制转换是反射,因为它的作用相同:有点像

SomeType s = (SomeType) x;

// is like
if (!(x instanceof SomeType)) {
  throw new ClassCastException();
}
SomeType s = (/* er, some magic that isn't a cast, because I'm saying "this is like a cast" */) x;

但是像这样的转换仍然在做明确的事情。您会在通用代码中得到隐式强制转换:

List<String> list = Arrays.asList("hi");
String s = list.get(0);

第二行在编译时转换为:

String s = (String) list.get(0);

因此,如果您接受强制转换作为反射操作,则通用代码将包含隐式强制转换。

答案 2 :(得分:0)

Java反射例如用于诸如ModelMapper之类的对象映射框架中。其他用例可能是诸如Spring之类的框架,在创建bean定义时以及在AOP中,反射用于检查类结构(方法/注释)。