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格式.
| 归档时间: |
|
| 查看次数: |
7004 次 |
| 最近记录: |