1. 问答
  2. 问答详情

java语言的“反射”功能

1个回答

0

采纳

反射

反射(reflection)允许静态语言在运行时(runtime)检查、修改程序的结构与行为。
在静态语言中,使用一个变量时,必须知道它的类型。在Java中,变量的类型信息在编译时都保存到了class文件中,这样在运行时才能保证准确无误。如果想在运行时改变,就需要反射了。

在Spring中,有这样的java bean配置:

<bean id="someID" class="net.liujiacai.Foobar">
    <property name="someField" value="someValue" />
</bean>

spring在处理这个bean标签时,发现class属性指定的是net.liujiacai.Foobar这个类,就会调用Class.forName(String)来实例化这个类,再通过反射,可以取到someField属性的值了。

如果我们想改变这个程序运行时的信息,我们这里直接修改bean,property的属性即可,无需重新编译。

在动态语言中,使用变量不需要声明类型,因而不需要这反射这种机制。 

比如在javascript中,我们知道有个变量foobar,不管foobar有没有sayHello()属性,我们都可以这么写:foobar.sayHello()

因为没有类型检查,这里这么写是允许的。至于在运行时报不报错,就要看运行时foobar的真正值了。


反射是不是破坏了封装性
说是,是因为,通过运用反射机制API,确实可以访问到一个对象的私有成员。
说不是,是因为,并不是所有的反射API,都破坏了封装性。即使因某种必要原因,访问了私有成员,封装的目的还是不变的。 

参考:http://www.programcreek.com/2013/09/java-reflection-tutorial/

http://stackoverflow.com/questions/16635025/dosent-reflection-api-break-the-very-purpose-of-data-encapsulation


撰写答案

验证码
点击刷新