如何在框架中使用反射?

Rya*_*yan 3 java reflection

Class是使用Java反射API的起点.我们可以用:

Class.forName("classname")
Run Code Online (Sandbox Code Playgroud)

获取Class描述符然后初始化对象,调用方法等.

这是框架使用反射的方式吗?例如,JUnit,Spring,Structs 2等.

Sot*_*lis 23

是.

例如,Spring使用<bean>定义

<bean id="someId" class="com.foopack.Foo">
    <property name="someField" value="someValue" />
</bean>
Run Code Online (Sandbox Code Playgroud)

当Spring上下文处理这个<bean>元素时,它将使用Class.forName(String)参数com.foopack.Foo来实例化该类(Class#newInstance()或获取一个Constructor,取决于).然后它将再次使用反射来获取<property>元素的适当setter 并将其值设置为指定的值value.

Junit还使用反射来获取一组要@Test注释的注释方法.要做到这一点,它需要获取一个Class实例.

基于Servlet的Web应用程序也使用反射来实例化Servlet,Filter以及不同类型的监听器类.例如,你会有

<servlet>
    <servlet-name>YourServlet</servlet-name>
    <servlet-class>com.servlets.YourServlet</servlet-class>
<servlet>
Run Code Online (Sandbox Code Playgroud)

并且容器将获取该完全限定的类名com.servlets.YourServlet,并实例化并注册它.

JSON解析器/生成器库也使用反射.例如,Gson给定一个类似的

class Foo {
    private String name = "FOOOO";
}
Run Code Online (Sandbox Code Playgroud)

和这样的实例

Foo foo = new Foo();
Run Code Online (Sandbox Code Playgroud)

你会像这样序列化它

Gson gson = new Gson();
String json = gson.toJson(foo);
Run Code Online (Sandbox Code Playgroud)

然后Gson将调用getClass()实例foo,获取一组Field实例Class,迭代该集合,并将字段的值序列化为JSON格式.

  • @onlinenaman 是和否。`@Autowired` 和像 `@PostConstruct 这样的生命周期方法仍然通过反射调用。实际上,唯一的区别是您可能在 `@Bean` 工厂方法中执行的操作,尽管 `@Bean` 方法也是通过反射调用的。 (2认同)