Class
是使用Java反射API的起点.我们可以用:
Class.forName("classname")
获取Class
描述符然后初始化对象,调用方法等.
这是框架使用反射的方式吗?例如,JUnit,Spring,Structs 2等.
是.
例如,Spring使用<bean>
定义
<bean id="someId" class="com.foopack.Foo"> <property name="someField" value="someValue" /> </bean>
当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>
并且容器将获取该完全限定的类名com.servlets.YourServlet
,并实例化并注册它.
JSON解析器/生成器库也使用反射.例如,Gson
给定一个类似的
class Foo { private String name = "FOOOO"; }
和这样的实例
Foo foo = new Foo();
你会像这样序列化它
Gson gson = new Gson(); String json = gson.toJson(foo);
然后Gson将调用getClass()
实例foo
,获取一组Field
实例Class
,迭代该集合,并将字段的值序列化为JSON格式.