选择性反射

2024-10-16

选择性反射(共7篇)

选择性反射 篇1

1 前言

《矿山安全法》和GB14161-93《矿山安全标志》对采矿业的安全生产与管理提出了更高要求, 其中要求之一就是要在矿山企业中广泛推行使用逆反射型矿山安全标志。矿山安全标志对于矿山的作业人员、机械、车辆能起到更好的安全保障作用, 作为逆反射型矿山安全标志在夜间和井下安全生产中将发挥出重要的安全警示作用。

然而, 由于矿山灰尘较多, 矿井下自然视认环境差, 造成标志面的逆反射性能和颜色受到很大影响, 同时矿车的车灯和矿工头带的矿灯的亮度较低, 因此矿山安全标志的色度区域选择应当更加重视, 以使标志更加醒目, 充分发挥其安全警示和安全导向作用。

2 色域选择

色域在色度学中是色度图上的一块面积或空间内的一个体积。这部分色度图或色空间, 通常包括所有可由特殊选择配色参量而复现的色。

由于逆反射安全标志的反光特性, 其亮度和明度明显高于其他反射体。合理的选择其色谱区域, 使其与环境形成鲜明色彩对比, 能有效增加其醒目度和视认效果。

2.1 色度空间

我们借助一种工具——色度空间来描述颜色, 在这个色度空间里, 对每一个颜色均能明确地描述和定义。过往多年, 人们曾尝试找出一个令人容易了解和在不同色域上都是等距的颜色空间。由此衍生出众多的颜色系统, 这些系统是当前色度学研究的重点。

最广泛的运用于测量物体色调的方式是CIE1976L*、a*、b*颜色空间 (即CIELAB色度空间) 。CIELAB色度空间, 把色调的颜色空间转化为立体的数学模型, 如图1。

L*——明度指数, 表示三维坐标物体的明度坐标, L为0时表示物体为对光完全吸收的黑体;L为100时表示物体对光完全反射的纯白物体。

a*——为红绿色度指数坐标, +a时表示红的程度, -a时表示绿的程度。

b*——为黄蓝色度指数坐标, +b时表示黄的程度, -b时表示蓝的程度。

在颜色视觉实验中最重要的是颜色匹配实验。色匹配就是用线性无关的三原色调配一种颜色。如果用 (R) 、 (G) 、 (B) 代表三个原色的单位量, 则可用下面的代数式表示一次颜色匹配实验结果:

C=R (R) +G (G) +B (B) (1)

式中:C代表调配得到的颜色, R、G、B是三个系数, 描述了颜色的三维空间。

为了计算的方便选择了X、Y、Z所对应的三原色匹配光谱色空间系统, 在此色空间中三原色 (X) 、 (Y) 、 (Z) 是虚拟的。 (X) 、 (Y) 、 (Z) 与 (R) 、 (G) 、 (B) 的关系可用下式表示:

1.0 (X) =2.3646 (R) -0.5151 (G) +0.0052 (B)

1.0 (Y) =-0.8965 (R) +1.4264 (G) -0.0144 (B) (2)

1.0 (Z) =-0.4681 (R) +0.0887 (G) +1.0092 (B)

X、Y、Z为三刺激值用来描述颜色的三维颜色空间, X与观测者的红刺激相关联, Y与绿刺激相关联, 而Z与蓝刺激相关联。Y值同时也代表颜色的明度。为此, 我们以三刺激值为基础计算出了CIE色度坐标xy, 并得到CIExy色度图。在xy色度坐标中, CIE三刺激值中Y仍然代表颜色的明度。

2.2 颜色的表示方法

物体的颜色取决于:光源的光谱成分, 可用光源的相对功率分布S (λ) 表示;物体对光谱的调制作用, 用调制函数 (光谱反射因数) R (λ) 表示。物体色的三刺激值表示为:

undefined

式中:undefined (λ) undefined (λ) 、undefined (λ) ——XYZ色度学系统中的色度函数;K——归一化系数。

用式 (3) 计算出来的三刺激值中的Y值, 直接就是总反射比的百分数。样品的色品坐标x、y、z表示为:

undefined

用Y及x、y三个参数, 就可以完整地描述一个颜色样品的色度学性质。因为这样既可表示这个样品的颜色, 又可表示出这个样品在一定光源照明下的明暗程度。

2.3 色域选择

逆反射安全标志是在白天和夜间或昏暗的天气、或矿山井下起警示或引导作用的标志, 因此, 醒目和高视认性是第一要素和必备条件。由于其具有逆反射特性, 也就具备了高视认性, 但醒目这一要素需要安全标志与背景颜色的对比, 所形成的反差来决定, 而色域的选择决定安全标志的醒目度。

2.3.1 均匀色空间

不同色相的颜色可以组成一个色相环, 按顺时针排列, 从黄到橙, 红, 紫, 蓝, 蓝绿, 绿, 最后回到黄。同一种色相的颜色, 由于明度的不同, 可以表现为较深或较浅, 如果某个颜色的饱和度减小, 这个颜色的鲜艳度就会变差, 如果某个颜色的饱和度为零, 那么该颜色就是非彩色。黑色, 白色和所有介乎其间的灰色都是非彩色, 只是它们的明度不同而已。

视觉明度上的等间隔与物理亮度系数的等间隔是不同的。没有两个样本的色度参数是百分百相同的, 但是为了统一标准就要提出颜色一致性的要求。我们也知道, 人对颜色的知觉是非常主观的。因此, 必须要用测色法来规定色差范围, 即选择均匀色空间。

2.3.2 国内外在用标准色域比对

关于逆反射物色在国内外标准中色度区域规定各有侧重, 下面是几个标准对白色的色域规定, 参考标准:GB/T18833-2002《交通标志反光膜》、GB2893-2001《安全色》、GB/T8416-2003《视觉信号表面色》、ASTMD4956-04 Standard Specification for Retroreflective Sheeting for Traffic Control、AS/NZS 1906 2006。各标准关于白色的色品坐标见表。

以上是国内外关于逆反射标志的几个标准对几种颜色的色域的规定比较, 更详细的信息及其他颜色色域可祥见各标准。

2.3.3 参考色域推荐

由于矿山井下背景昏暗, 灰尘多, 安全标志面应在各颜色区域内尽量选择饱和明亮的色域, 并符合CIE标准光谱响应曲线, 见图2。利用与背景反差的区别给人创造醒目的主观感受, 以使安全标志达到高视认效果。

根据以上的分析理念, 在矿山逆反射标志的色域选择上推荐:白、黄、红、橙可参考GB/T8416-2003《视觉信号表面色》的规定, 蓝、绿、棕可参考GB/T18833-2002《交通标志反光膜》的规定, 荧光色的颜色区域可参考采用美国ASTM D4956-04 Standard Specification for Retroreflective Sheeting for Traffic Control 的规定。

荧光色由于有着很好的穿透性, 在雾、露、霜、雪, 多尘、黑暗等环境下可以比普通色增加50%以上的视认性, 在警告标志、导向标志、临时标志等情况下使用效果良好。选择荧光黄绿、荧光黄、荧光橙是CIE标准光谱视觉效率曲线中最醒目的颜色。

3 颜色的测量方法分析

颜色测量理论与技术是色度学的组成部分.它是本世纪发展起来的一门以物理光学、视觉生理、视觉心理、光电子学、电子计算技术为基础的综合性科学技术。颜色的测量方法可分为两类, 即光谱光度测色法和色度计法。

3.1 标准照明体与测量几何

CIE国际照明委员会, 对作为光源的照明体 (光谱能量分布) 有统一的标准, 两种最重要的照明体是重组日光 (标准照明体D65) 和钨丝灯 (CIE标准照明体A) 。

为了使颜色测量标准化, 国际照明委员会推荐了几种标准的几何条件, 规定了对样品的照明方式和观测样品的方向。对反射型样品共有四种照明/观测条件:0/d或d/0;0/45或45/0。

基于逆反射特性在测量中多采用0/45或45/0测量几何条件。

3.2 光谱光度测色法

光谱光度测色法是使用分光光度计测色, 分光光度计是用于测定物体光谱反射率曲线的仪器。通常采用模拟日光进行照明。从物体反射出来的光线直接照射到单色器上 (光谱分析器) 。单色器中的衍射光栅将反射光按波长分类, 通常范围是从360nm到780nm。单色器中光电二极管阵列测量反射光线, 以测定不同波长下反射光谱所占比例。电脑软件将以5nm或10nm间隔显示反射率数据并绘制成光谱反射率的曲线

基于式 (3) , 反射样品的颜色测量问题可以归结为测定样品的光谱反射比, 可用光谱光度计来进行。

双光路测量样品的光谱反射比值计算公式:

undefined

式中:ρ (λ) ——样品的光反射比值;

ρ0 (λ) —— 工作标准白板的光反射比值;

γ (λ) —— 样品的光谱响应读数;

γ0 (λ) —— 工作标准白板的光谱响应读数。

单光路测量样品的光谱反射比值计算公式:

undefined

式中:ρ0 (λ) ——工作标准白板的光谱反射比;

ρw (λ) —— 积分球壁的0/d条件下的光谱反射比;

fi—— 积分球壁上第i孔的百分比面积;

fs—— 样品孔的百分比面积。

样品的三刺激值采用等间隔法计算, 一般采用10nm或5nm波长间隔, 波长范围为380~780nm, 计算公式采用式 (3) 。

色坐标计算方法采用公式 (4) 。

3.3 直读式色度计法

由于电子技术和计算机技术的发展, 直读式色度计可以将输出信号加以调整, 方便的直接读出X、Y、Z三刺激值。必要时, Y值可直接调整为亮度值或总反射比值, 同时计算并输出色坐标x、y值。还可以把两个颜色样品的色度值储存并加以计算, 输出它们的色差值。

使用直读式色度计在测量之前要进行分度校准。在测量逆反射色时, 使用工作标准白板对仪器进行分度校准。

为了减少测量误差, 可采用与样品光谱反射比相近似的工作标准色板对仪器进行分读校准。工作标准色板的三刺激值应由光谱光度测色法测定, 其照明和探测的几何条件, 应与所使用的测色仪器测量条件一致。

4 结论

通过以上的分析得出如下结论:

(1) 颜色并不是物体的一种物理属性, 而是一种人的主观感受, 为了对颜色形成量的概念, 我们借助一种工具——色度空间来描述颜色, 在这个色度空间里, 对每一个颜色均能明确地描述和定义。

(2) 用Y及x、y三个参数, 就可以完整地描述一个颜色样品的色度学性质。因为这样既可表示这个样品的颜色, 又可表示出这个样品在一定光源照明下的明暗程度。

(3) 逆反射型安全标志的颜色及色域选择直接影响标志的醒目度和视认性, 即影响其安全警示作用, 因此在确定颜色及色域时既要考虑使用目的又要考察使用环境, 与背景反差的区别给人产生不同的主观感受。

(4) 两种测试方法可满足不同的测量需要, 光谱光度测色法是测定样品光谱反射率曲线, 可以观察380~780nm波长范围内样品在任一波段的光谱反射比, 样品的三刺激值采用等间隔法计算;色度计法使用方便, 可直接测出X、Y、Z三刺激值, 同时可计算并输出色坐标x、y值, 还可以把两个颜色样品的色度值储存并加以计算, 输出它们的色差值, 但工作标准色板的三刺激值应由光谱光度测色法测定。

摘要:本文从色度学的角度阐述了颜色是人的主观感受, 为了对每一个颜色均能明确地描述和定义, 借助色度空间概念, 把色调的颜色空间转化为立体的数学模型。根据矿山现场工作环境特点及对国内外相关标准中逆反射色域分析, 建立逆反射型矿山安全标志的色域选择理念, 并对两种不同的测色方法进行了分析研究。

关键词:逆反射,型矿山安全标志,色域,测色,安全警示

参考文献

[1]董会君等.浅谈我国逆反射材料现状及其发展趋势展望.中国安全科学学报, 2004, 14 (2) :71~75

[2]朱俊伟.影响回归反射织物反光性能主要因素的研究纺织科学研究.2000, (2) :41~45

[3]邱江桐.逆反射材料应用和测试中的几个问题.灯与照明———全国交通运输照明和光信号科技研讨会专辑.1999, 23 (3) :21~22

[4]CIE54.2:2001.Retrorefiection Definition and measure-ment

[5]郝允祥, 陈遐举, 张保洲.光度学.北京:师范大学出版社, 1998

[6]ASTM D4956-04.Standard Specification for Retroreflec-tive Sheeting for Traffic Control

[7]董会君等.高可视警示服的安全防护作用及其标准分析.中国安全生产科学技术.2007, 3 (3) :53-57

[8]董会君等.回归反射材料光度测试探讨.中国安全生产科学技术, 2007, 3 (5) :67~70

[9]苏朝锐.颜色的机理和新闻纸色调.造纸科学与技术2002, 21 (4) :23~28

[10]赵成文, 林世海, 施元春.颜色反射比测量的探讨.照明.1999, 20 (3) :21~24

选择性反射 篇2

FAST的主动变形反射面由四周支撑的圈梁, 主体结构的主索、连接地面调节面型的下拉索、以及索网上铺设的面板构成[1] (见图1) 。下拉索下面的驱动电机调节下拉索长度, 靠整体索网的弹性变形实现反射面的面型调整。FAST望远镜通过将有效口径300 m内的反射面板主动变形成为抛物面将射电信号反射到悬挂在空中的馈源中, 根据不同的观测目标, 有效口径所处反射面的位置不同 (见图2) 。为保证有效口径内反射面板的变形精度, 需要对其中的近一千个锁网节点进行快速高精度测量。

1 FAST反射面测量样机原理

针对反射面测量任务目标多、速度快、精度高要求, 专门研发了一套将摄影测量技术与高精度转动平台结合的测量设备 (图3) , 将反射镜安装在精密二维旋转平台上, 通过将反射镜转到不同角度实现摄影测量目标区域的快速切换。反射面测量方案与样机更加更加详细的介绍见参考文献[2, 3]。

本文主要针对旋转的反射镜对摄影测量算法的影响进行分析研究。

2 反射镜对摄影测量算法的影响分析

2.1 简单模型

对于世界坐标系下物点Q点 (x0, y0, z0) , 相对于平面镜Ax+By+Cz+D=0的虚像Q’坐标为 (x0', y0', z0') 如图4。

为计算 (x', y', z') 坐标, 可由Q点做垂直于平面镜的垂线, 则垂线方程为, 其中t为变量。将垂线方程带入平面镜方程, 计算垂点。有

解得:, 将t=t0带入垂线方程即可得到垂点坐标。将t=2 t0带入则可得到像点Q’坐标, 即

整理后得到

对于测量样机, 其反射镜安装在相机与镜头上方, 可在水平与俯仰方向旋转, 以完成对测量区域的照准 (图5) 。

首先建立测量样机坐标系, 令反射镜两旋转轴交点为样机坐标系原点O, 水平轴AZ与俯仰轴EL均旋转0度角时法线方向为y轴, 向上为z轴, 右手定责确定x轴, 建立样机坐标系 (图6) 。

这样, 在不旋转时反射镜在坐标系x-O-z平面上。当反射镜分别绕AZ、EL轴旋转az, el角度时, 其法向指向如图6, 在y-O-z平面为零, 向x正方向为负;, 在x-O-y平面为零, z轴正向为正。

在反射镜旋转过角度az, el后, 其法线方向变为 (sinazcoselcosazcosel, -sinel) , 反射镜方程为sinazcoselx+cosazcosely-sinelz=0, 由于坐标原点在反射镜平面上, 反射镜平面公式常数项为零。

设, 则可利用式 (1) 计算反射镜物点与像点的转换关系

对于小孔成像模型, 摄像机坐标系中像点像素坐标 (u, v) , 与世界坐标系中物点 (x, y, z) 的转换关系[4]为

, 其中M为相机参数矩阵, 由内参数矩阵M1和外参数矩阵M2构成, 可由系统初始标定得到。在此项目中, 目标点像素坐标 (u0, v0) 与物点 (x0, y0, z0) 的虚像 (x0', y0', z0') 满足以下关系, 结合式 (3) 则有

这样通过两台测量仪器中相同目标点在不同相机中的成像的像素坐标即可消去比例因子s, 解算出目标点在世界坐标系的坐标。

2.2 真实模型

在实际对测量样机进行安装时, 其水平转动轴与俯仰转动轴不可能做到垂直相交, 必然会产生不垂直 (夹角α) 与不相交 (距离d) 的情况。在考虑到这些情况后, 解算的数学模型变得更加复杂。

设AZ轴与EL轴的距离为d, 当az与el转角均为0时, 做AZ与EL的公垂线S, 交AZ于O, 交El于O’。公垂线S长度为d。则EL必在垂直于S且通过O’的平面P上, 且此平面必平行于AZ。以O为原点, AZ向上方向为z轴, 垂直于平面P且指向待测目标的方向为y, 右手定则确定x, 建立测量样机坐标系。此坐标系与仪器基础固连, 不随AZ、EL转动而变化。

在AZ轴转动时, 平面P随之绕AZ转动;在EL轴转动时平面P再绕其上面的EL轴转动到P’, 此时P’位置既为反射镜面的位置, 只要求出O’点位置以及P’法向方向即可得到反射镜在O-xyz坐标系下的坐标。

在AZ转动时O’点以固定半径绕O旋转, EL转动时O’不变, 其坐标为 (dsinaz, -dcosaz, 0) 。

通过坐标转换的方式计算P’法线方向:

1) 将O-xyz绕z轴 (AZ) 旋转az角度, 得到O-x1y1z1, 转换矩阵

2) 将O-x1y1z1沿-y1轴方向平移d得到O'-x2y2z2, 转换矩阵

3) 将O'-x2y2z2绕y2转动α角, 得到O'-x3y3z3, 转换矩阵

4) 将O'-x3y3z3绕x3转动el角, 得到O'-x'y'z', 转换矩阵

此时O'x'z'平面既为P’平面镜。

由坐标转换矩阵的性质, O-xyz坐标系下点 (x, y, z) 在O'-x'y'z'坐标系下坐标为

则可简化为:, 因此有, 其中H-1=H-11H-12H-13H-14。

在O'-x'y'z'坐标系下, 平面镜P’的法线起点与终点分别为 (0, 0, 0) , (0, 1, 0) , 这两点在O-xyz坐标系下的坐标分别为:, 因此法线方向为

由平面上一点O'= (dsinaz, -dcosaz, 0) 和法线方向即可计算得平面镜在O-xyz坐标系下表达式为, 转换为标准形式为Ax+By+Cz+D=0其中

代入式 (2) 中简化后得到

为点 (x0, y0, z0) 相对于平面P’的像点 (x0', y0', z0') 的转换关系。结合摄影测量模型可得到相机像点 (u0, v) 与物点 (x0, y0, z0) 的转换关系

式 (5) 中A、B、C、D为与az、el、d和α相关的参数, 与初始安装和转轴转角有关, 见式 (4) ;M为相机的内外参数矩阵, 可在初始标定中得到。

由 (5) 可知, 对于任意世界坐标系下目标点 (x0, y0, z0) , 每台相机可得到两个观测量, 即两个计算公式, 使用两台相机即可解算目标点的世界坐标;当使用多台相机进行测量, 或视场内有多个目标点时, 存在多余观测, 即可使用平差算法进一步提高测量精度。

3 结论

在使用反射镜后, 通过反射镜的两轴旋转即可极大地扩展相机的测量范围, 并避免了相机本身转动可能带来的内外参数变化, 有着很高的系统稳定性。通过实时取得的转轴角度数据即可得到转换矩阵, 将经过反射镜的测量转换为传统的摄影测量算法, 如后续需要提高测量精度, 采用更加复杂的摄影测量模型时, 此转换矩阵仍然适用。

反射镜的使用虽然增加了目标点的解算过程, 但通过前期的精密标定以及转角的精确测量, 对测量精度的损失微乎其微, 但极大地扩展了测量范围, 在大范围、多目标快速高精度测量领域有着广泛的应用前景。

摘要:FAST (500 m口径球面射电望远镜) 是中国在贵州依托当地特有的卡斯特地貌建造的球面射电望远镜, 建成后它将成为全世界最大的射电望远镜。其反射面结构由锁网张拉而成, 在其500 m口径的反射面内共有约2 200个锁网节点, 节点的准确测量是保证望远镜运行精度的重要因素。反射面测量样机采用的是高精度摄影测量相机与精密转台结合的方式, 通过旋转转台上的反射镜对反射面内不同位置的目标点进行对准、测量。在常见的摄影测量算法基础上, 研究了反射镜的反射对于摄影测量算法的影响;并给出了理想情况下与存在安装误差的情况下两旋转轴在旋转不同角度时反射镜的反射作用在摄影测量算法中的等效转换矩阵。

关键词:摄影测量,反射镜,FAST,坐标转换

参考文献

[1] Nan Rendong.Introduction to FAST:five hundred meter aperture spherical radio telescope.Proc SPIE 7012, Ground-based and Airborne Telescopes II, 70121E.August 27, 2008

[2] Zhu Lichun.The study on the scheme of dynamic measurement of the main active re?ector for FAST.Proc of SPIE, 2008:70120U-2, 7012

[3] Hu Jinwen.Measurement scheme and simulation for the main reflector of FAST.Meas Sci Technol, 2013;24 (9) :095006

浅谈Java反射机制 篇3

自从1995年问世以来, Java一直以其面向对象的, 可移植的, 多线程的和动态的特点而著称, 并得到了广泛的应用。严格来讲, java并不能算纯粹的动态语言, 但是Java有着一个非常突出的动态相关机制:反射 (Reflection) 。在Java中我们可以于运行时加载、发现、使用编译期间完全未知的classes。换句话说, Java程序可以加载一个运行时才得知名称的class, 得到其完整构造 (但不包括methods定义) , 并生成其对象实体, 或对其fields设值;或调用其methods。这种“看透class”的能力被称为introspection (内省、内观、反省) 。

一、Java中反射的实现方法

在Java中, 主要由以下类来实现Java反射机制, 这些类都位于java.lang.reflect包中。

(一) Class类:代表一个类。

(二) Field类:代表类的成员变量 (成员变量也称为类的属性) 。

(三) Method类:代表类的方法。

(四) Constructor类:代表类的构造方法。

(五) Array类:提供了动态创建数组, 以及访问数组的元素的静态方法。

在java.lang.Object类中定义了get Class () 方法, 对于任意一个Java对象, 都可以通过此方法获得Class类的实例。Class类是Reflection API中的核心类, 提供了数十多个的Reflection APIs (如下表) 。通过这些API, 我们就可以对对象进行操作了。举例如下:

以下是用于查找构造函数的一组反射调用:

Constructor get Constructor (Class[]params) ———获得使用特殊的参数类型的公共构造函数,

Constructor[]get Constructors () ———获得类的所有公共构造函数

Constructorget Declared Constructor (Class[]params) ———获得使用特定参数类型的构造函数 (与接入级别无关)

Constructor[]get Declared Constructors () --获得类的所有构造函数 (与接入级别无关)

获得字段信息的Class反射调用, 在参数类型数组中使用了字段名:

Field get Field (String name) ———获得命名的公共字段

Field[]get Fields () ———获得类的所有公共字段

Field get Declared Field (String name) ———获得类声明的命名的字段

Field[]get Declared Fields () ———获得类声明的所有字段

用于获得方法信息函数:

Method get Method (String name, Class[]params) ———使用特定的参数类型, 获得命名的公共方法

Method[]get Methods () ———获得类的所有公共方法

Method get Declared Method (String name, Class[]params) ———使用特写的参数类型, 获得类声明的命名的方法

Method[]get Declared Methods () ———获得类声明的所有方法

二、反射的使用方法

在这里, 让我们针对一些Reflection APIs举出一些实例。

(一) 得到某个对象的属性

Class owner Class=owner.get Class () :得到该对象的Class。

Field field=owner Class.get Field (field Name) :通过Class得到类声明的属性。

Object property=field.get (owner) :通过对象得到该属性的实例, 如果这个属性是非公有的, 这里会报Illegal Access Exception。

(二) 得到某个类的静态属性

Class owner Class=Class.for Name (class Name) :首先得到这个类的Class。

Field field=owner Class.get Field (field Name) :和上面一样, 通过Class得到类声明的属性。

Object property=field.get (owner Class) :这里和上面有些不同, 因为该属性是静态的, 所以直接从类的Class里取。

(三) 执行某对象的方法

Class owner_class=owner.get Class () :首先还是必须得到这个对象的Class。

Methodmethod=owner Class.get Method (method Name, args Class) :通过Method名和参数的Class数组得到要执行的Method。

method.invoke (owner, args) :执行该Method, invoke方法的参数是执行这个方法的对象和参数数组。返回值是Object, 也即是该方法的返回值。

(四) 新建实例

这里说的方法是执行带参数的构造函数来新建实例的方法。如果不需要参数, 可以直接使用newone Class.new Instance () 来实现。

Class newone Class=Class.for Name (class Name) :第一步, 得到要构造的实例的Class。

Constructor cons=newone Class.get Constructor (args Class) :得到构造方法。

cons.new Instance (args) :新建实例。

三、总结

Java语言反射提供一种动态链接程序组件的多功能方法。它允许程序创建和控制任何类的对象 (根据安全性限制) , 无需提前硬编码目标类。这些特性使得反射特别适用于创建以非常普通的方式与对象协作的库。Java的这一特性非常强大, 并且是其它一些常用语言, 如C、C++、Fortran或者Pascal等都不具备的。

Java反射机制探究 篇4

反射 (reflection) 的概念是由Smith在1982年首次提出的, 主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用, 并在Lisp和面向对象方面取得了成绩。最近, 反射机制也被应用到了视窗系统、操作系统和文件系统中。

1 Java反射机制原理

反射是Java被认为是动态语言的一个非常重要的特性, 它允许动态发现和绑定类、方法、字段, 以及所有其他的由语言所产生的元素。也就是说, 这类应用通过采用某种机制来实现对自己行为的描述和监测, 并能根据自身行为的状态和结果, 调整或修改应用所描述行为的状态和相关的语义。

当前主流的计算反射原型系统大多是建立在元对象协议的体系结构上, Java语言的反射机制也是建立在这种体系结构之上。在Java反射系统中, 有一部分程序用来描述和计算问题域, 称之为应用程序 (application program) , 而有一部分程序专门用来表达和控制应用程序的计算行为, 称之为元程序 (meta program) , 即程序的程序。元程序在整个系统所处的层次称为元级 (meta-level) , 相应地, 直接执行应用功能的程序处于应用级或更通常地称为基础级 (base-level) 。简而言之, 基础级是人们所熟悉的普通应用程序对象所处的级别, 是用来描述计算系统所要解决的问题域的, 而元级则是描述和控制基础级计算行为的级别。其结构如图1所示。

这种层次结构, 使系统很好地模块化了, 使得元级和基础级分离。元级层对象和基础级层对象因果关联, 元级层对象的任何改变都被反射到基础级层对象。当一个对象被反射, 它的所有方法都被反射到相应的元级层对象。Java从JDK1.1版本开始增加了Java.lang.reflect程序包, 为用户提供访问元级的接口, 在JDK1.5中, 还引入了JMX (Java Management extend) 包来支持新型的对底层资源管理的反射。“Class”类是Java中一个十分特殊的类。它和其它类一样继承自“Object”类, 其对象用以表达Java程序运行时的类和接口, 它是Java反射机制的起源。针对任何想探查的类, 只有先为它产生一个“Class”对象, 接下来才能由这个“Class”对象调用其它的反射API。因此, 利用反射APIs动态地访问某个类要经过以下3个步骤: (1) 创建一个“Class”对象; (2) 利用创建的“Class”对象获得类的内部信息; (3) 利用java.1ang.reflect包中提供的反射APIs, 动态处理上一步获得的类的内部信息。

如何使用java.lang.reflect程序包中的反射APIs, 显示它们的威力, 我们下面通过实验来证明。

2 应用分析

动态替换一个处于运行状态的类是一个非常有挑战性的难题。这是Java的一个正在进行的研究领域, 要进行类替换要涉及到修改编译器或虚拟机或者二者都有之。尽管解决这个问题很困难, 在合适的环境下利用反射机制动态替换一个类还是可行的。下面的实例将实现动态替换一个正在运行的类。由于不能强引用类对象, 否则将无法实现类替换, 我们使用Proxy和Weak Reference来清除这个障碍。我们首先定义一个接口Operator, Operator接口使用Proxy类和类Operator EX类实现, 以达到隐藏正在运行类的信息。关键代码如下:

运行结果如图2所示。

反射使程序代码允许执行时能够接入装载到JVM中的类的内部信息, 而不是源代码中选定的类协作的代码。这使反射成为构建灵活的应用的主要工具。但需注意的是如果使用不当, 使用反射的成本会很高。安全和性能是两个重要的因素, 在处理反射时安全性是一个较复杂的问题, 但反射经常由框架型代码使用, 这样就无需考虑常规的接入限制。但是使用反射降低系统性能是不可避免的, 反射基本上是一种解释操作, 您可以告诉JVM希望做什么并且它满足您的要求。这类操作总是慢于直接执行的相同的操作。下面这个小程序就验证了使用反射调用比常规调用性能要差的多。部分代码如下:

运行结果如图3所示。

从运行结果可以看出, 反射调用比常规调用要花费几倍的时间。所以说, 反射最好在使用反射益处远远大于它造成性能低下的情况下再考虑使用它。

3 结束语

反射是Java语言的一种强大工具。它能够创建灵活的代码, 这些代码可以在运行时装配, 无需在组件之间进行源代表链接。虽然目前Java语言的标准版中已定义了反射接口和反射库, 但是只是实现简单的静态反射。Java语言的执行过程不同于其他的面向对象语言, 它的解释器有两部分:编译器和解释器。因而实现Java反射的方法引起了很多研究者的关注, 对于Java的反射研究一直在继续着, Spring, Hibernate等都是研究出来的基于反射的优秀框架, 在使用Java语言开发出灵活、低耦合、高重用的系统的过程中反射机制起到越来越关键的作用。

摘要:反射是提高Java程序的灵活性和可扩展性至关重要的技术, 它使得Java软件系统具有自适应能力, 实现程序的动态演进。阐述了Java反射机制的原理和工作过程, 并通过应用实例证明Java反射机制的强大威力和使用它应注意之处。

关键词:Java,反射,类替换,性能

参考文献

[1]Ira R.Forman, Nate Forman.Reflection In Action[M].America:Manning Publications Co., 2005.

[2]Christof Lutteroth, Gerald Weber, Reflection as a Principle for Better Usability[J].IEEE, 2007 (40) .

[3]王爱莉, 于林宇, 吕江花.面向反射程序设计方法[J].吉林大学学报 (信息科学版) , 2005 (5) .

[4]冯荣峰, 王建民, 孙家广.计算反射技术综述[J].计算机工程与应用, 2003 (27) .

[5]唐亚哲, 李增智, 张鹏.开放实现与计算反射技术综述[J].计算机科学, 2002 (2) .

晒晒光的反射知识 篇5

1. 反射规律实验探究。

例1 (2013·山东东营) 小明在探究“光反射时的规律”时将一块平面镜放在水平桌面上, 再把一张纸板放置在平面镜上。

(1) 小明让一束光贴着纸板射到O点 (如图甲) , 要使入射光线和其反射光线的径迹同时在纸板上出现, 纸板与平面镜的位置关系是______ (选填“一定垂直”、“一定不垂直”或“可以垂直也可以不垂直”) 。

(2) 小明探究反射角和入射角之间的关系时, 三次改变入射角i的大小 (如图乙) , 实验所测数据如下表, 他根据表中数据得出的结论和其他同学的结论并不一致。请你根据表中的数据分析小明实验中出现错误的原因是______

解析: (1) 光的反射规律:三线共面 (入射光线、反射光线、法线在同一平面上) , 两线分居 (入射光线、反射光线分居法线两侧) , 两角相等 (入射角、反射角) , 光路可逆。

要使入射光线和其反射光线的径迹同时在纸板上出现, 则法线必须与平面镜垂直, 并且反射光线、入射光线和法线必须在同一平面内, 因此纸板与平面镜的位置关系必垂直;

根据反射定律, 反射角等于入射角, 反射角是反射线与法线的夹角, 入射角是入射线与法线的夹角, 当入射角分别为20°、30°、50°时, 反射线与法线的夹角, 即反射角也应分别是20°、30°、50°, 而70°, 60°, 40°正好是反射光线与镜面的夹角, 所以是把反射光线与镜面的夹角当成了反射角。

答案: (1) 一定垂直; (2) 把反射光线与镜面的夹角当成了反射角。

点拨:本题考查了研究光的反射定律的实验, 反射角等于入射角。反射光线与法线的夹角才是反射角, 而不是反射光线与镜面的夹角.

2. 反射光路图

例2. (2013·山东枣庄) 如图所示, 一束光沿AO方向斜射到平面镜上, 画出入射光线的反射光线, 并标出反射角大小。

解析:要解决此题, 需要掌握光的反射定律的内容:即“三线共面, 两线分居, 两角相等”;要掌握入射角和反射角的概念:入射角是入射光线与法线的夹角;反射角是反射光线与法线的夹角.

具体作图步骤如下:首先做出法线, 入射光线与镜面的夹角是30°, 所以入射角为90°﹣30°=60°.根据反射角等于入射角做出反射光线.反射角也为60°.

点拨:此题主要考查了光的反射定律的应用, 首先要熟记光的反射定律的内容, 并要注意入射角与反射角的概念。

例3 (2013·辽宁锦州) 如图所示, 发光点S发出的某光线经平面镜发射后, 发射光线恰好经过A点, 请在图中画出这条光线。

解析:首先要明确平面镜成像的特点:像与物关于平面镜对称, 作出发光点S的像点S', 根据反射光线反向延长通过像点, 可以由像点和A点确定反射光线所在的直线, 从而画出反射光线, 并确定反射点, 最后由发光点和反射点画出入射光线, 从而完成光路。

具体作图方法为:作出发光点S关于平面镜的对称点, 即为像点S', 连接S'、A点交平面镜于点O, 沿OA画出反射光线, 连接SO画出入射光线, 如图所示:

点拨:本题考查利用平面镜成像的特点作图.平面镜成像特点与光的反射定律相结合来作图, 比较直观、简捷、准确。

3. 反射的黑箱问题。

例4 (2013·四川资阳) 如图所示, 已知一束光的一条边缘光线a的传播光路, 请根据光的反射定律作出另一条边缘光线b的传播光路, 并在虚线框内画出相应的光学元件。

解析: (1) 知道一条入射光线和反射光线, 作出两光线夹角的角平分线, 可得法线O1N1, 得出法线, 再作法线的垂线, 可得平面镜的位置;

(2) 延长第二条入射光线, 与平面镜的交点即入射点O2, 过O1画出法线O2N2, 根据反射角等于入射角画出反射光线, 如图所示:点拨:此题主要考查了光的反射定律的应用, 有关定律的内容要牢记, 同时会灵活的运用, 画图时注意实、虚线分开。

4. 全反射。

例5 (2013·辽宁锦州) 当光从水斜射入空气中时, 在交界面上同时发生反射和折射, 但折射角总大于入射角。当入射角增大到一定程度时, 折射角会达到90°。入射角继续增大时, 便没有______, 只有反射了。这种反射叫全反射。光纤通信就是利用激光在光纤内壁不断____ (填“反射”或“折射”) 而实现的。

解析: (1) 要发生光的全反射, 必须光从光密介质进入光疏介质, 且入射角大于临界角。当光从水斜射入空气中, 入射角继续增大, 大于临界角时, 便没有折射, 只有反射了, 这种反射叫全反射; (考查了学生理解能力和阅读能力) 。

(2) 光纤通信是通过激光在光纤内不断反射向前传播, 从而传递信息的;

答案:折射;反射。

Java反射机制的研究 篇6

Java反射机制指的是在Java程序运行状态中,对于任何一个类,都可以获得这个类的所有属性和方法;对于给定的一个对象,都能够调用它的任意一个属性和方法。这种动态获取类的内容以及动态调用对象的方法称为反射机制[1]。

Java的反射机制允许编程人员在对类未知的情况下,获取类相关信息的方式变得更加多样灵活,调用类中相应方法,是Java增加其灵活性与动态性的一种机制。

二、Java反射机制的功能

2.1获得某个对象的属性。通过get Class()方法获得某个对象的类,然后实例化一个Field对象,接收类声明的属性,最后通过get()方法获得该属性的实例,注意,这里的属性必须为公有的,否则将会报illegal Access Exception的异常。

2.2获得某个类的静态属性。首先根据类名获得该类,同获得某个对象的属性一样,通过实例化一个Field对象,接收该类声明的属性,不同的是,由于属性是静态的,所以直接从类中获取[2]。

2.3执行某对象的方法。同样要先获得对象的类,然后配置类的数组,并把它作搜索方法的条件。通过get Method()方法,得到要执行的方法。

执行该invoke方法,该方法中执行的是owner对象中带有参数args的方法。返回值是一个对象。

2.4执行某个类的静态方法。基本的原理和“执行某个类的方法”相同,不同点在于method.invoke(null,args),这里的第一个参数是null,因为调用的是静态方法,所以不需要借助owner就能运行。

2.5新建类的实例。我们利用执行带参数的构造函数的方法来新建一个实例。如果不需要参数,可以直接使用newone Class.new Instance()来实现[3]。

同样要先得到要构造的实例的类,然后构造参数的类数组,构造器是通过get Constructor(args Class)得到的,最后使用new Instance(args)方法新建一个实例。

三、Java反射机制的特点

尽管反射机制带来了极大的灵活性及方便性,但反射也有缺点。反射机制的功能非常强大,但不能滥用。在能不使用反射完成时,尽量不要使用,原因有以下几点:

3.1性能问题。Java反射机制中包含了一些动态类型,所以Java虚拟机不能够对这些动态代码进行优化。因此,反射操作的效率要比正常操作效率低很多。我们应该避免在对性能要求很高的程序或经常被执行的代码中使用反射。而且,如何使用反射决定了性能的高低。如果它作为程序中较少运行的部分,性能将不会成为一个问题。

3.2安全限制。使用反射通常需要程序的运行没有安全方面的限制。如果一个程序对安全性提出要求,则最好不要使用反射。

3.3程序健壮性。反射允许代码执行一些通常不被允许的操作,所以使用反射有可能会导致意想不到的后果。反射代码破坏了Java程序结构的抽象性,所以当程序运行的平台发生变化的时候,由于抽象的逻辑结构不能被识别,代码产生的效果与之前会产生差异。

四、总结

Java的反射机制提供了一种动态链接程序组件的方法。它允许Java程序构建和控制所有类的对象,不再需要提前书写目标类。这些特性使得反射特别适合用普通方式创建的库。反射机制十分有用,它使得数据结构和类能够按名称动态检索,并允许在运行程序的同时操作这些信息。Java的这一特性是非常强大,并且是其它一些例如C语言,C++等所没有的。

在编程过程中,Java反射机制的应用十分广泛,使用反射机制能够提高系统的灵活性和可扩展性,而且能够通过加载外部插件,使得系统与插件解耦,同时使得功能的多样性得到提高。但反射机制不可避免地存在一些不足之处,因此,在实际开发过程中要根据项目需要,灵活地选择编码方法。

参考文献

[1]尹松强,傅鹂.Java反射机制探究[J].软件导刊,2008,11:85-87.

[2]王善发,吴道荣.Java语言的反射机制[J].保山学院学报,2011,05:32-36.

[3]丘志杰,罗蕾.嵌入式Java反射机制的设计与实现[J].计算机应用,2010,02:398-401+422.

Java反射技术浅谈 篇7

(1)反射的引入

反射(Reflection)的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。其中LEAD/LEAD++、Open C++和Open Java等就是基于反射机制的语言。

自从1995年问世以来,Java一直以其面向对象的、可移植的、多线程的和动态的特点而著称,并得到了广泛的应用。严格来讲,Java并不能算纯粹的动态语言,但是Java有着一个非常突出的动态相关机制:反射(Reflection)。在Java中我们可以于运行时加载、发现、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,得到其完整构造(但不包括methods定义),并生成其对象实体,或对其fields设值;或调用其methods。

我们可以通过以下语句对反射有一个更清楚的认识。“Person p=new Person();”这是什么?当然是实例化一个对象了。可是这种实例化对象的方法存在一个问题,就是必须要知道类名才可以实例化它的对象,这样我们在应用方面就会受到限制。那么有没有这样一种方式,让我们不知道这个类的类名就可以实例化它的对象呢?有,可以采用反射技术来实现。

(2)反射的主要接口和类

在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中。

◆Class类:代表一个类;

◆Field类:代表类的成员变量(成员变量也称为类的属性);

◆Method类:代表类的方法;

◆Constructor类:代表类的构造方法;

◆Array类:提供了动态创建数组,以及访问数组元素的静态方法。

1 反射的入口:Class类

Java中的类反射就是一个在当前JVM中支持类、接口和对象内省的、小型的、类型安全的和可靠的API。它是通过java.1ang.reflect包提供的,可以对类的能力进行分析。反射使程序代码能够访问装载到JVM中的类的内部信息,主要包括获取已装载类的字段、方法和构造函数的信息,允许编写处理类的代码。这些类是在程序运行时临时确定的,而非源代码中事先选定的,这使反射成为构建灵活应用的主要工具。

1.1 Class类

Java中的“Class”类是Java中一个十分特殊的类。它和其它类一样继承自“Object”类,其对象用以表达Java程序运行时的类和接口。当一个类被加载时,JVM便自动产生一个类对象。

在java.lang.Object类中定义了getClass()方法,因此对于任意一个Java对象,都可以通过此方法获得对象的类型。Class类是Reflection API中的核心类,它有以下方法:

◆getName():获得类的完整名字;

◆getFields():获得类的public类型的属性;

◆getDeclaredFields():获得类的所有属性;

◆getMethods():获得类的public类型的方法;

◆getDeclaredMethods():获得类的所有方法;

◆getMethod(String name,Class[]parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes参数指定方法的参数类型;

◆getConstrutors():获得类的public类型的构造方法;

◆getConstrutor(Class[]parameterTypes):获得类的特定构造方法,parameterTypes参数指定构造方法的参数类型;

◆newInstance():通过类的不带参数的构造方法创建这个类的一个对象。

“Class”是Java反射机制的起源。针对任何想探查的类,只有先为它产生一个“Class”对象,接下来才能由这个“Class”对象调用为数十多个的反射APIs。因此,利用反射APIs动态访问某个类要经过以下三个步骤:

(1)创建一个“Class”对象;

(2)利用创建的“Class”对象获得类的内部信息;

(3)利用java.1ang.reflect包的反射APIs,动态处理上一步获得的类的内部信息。

1.2 Class类举例

1.3 取得Class实例的方法

2 反射的具体使用

Class对象可以获得该类里的成分,包括构造器(由Constructor对象表示)、方法(由Method对象表示)、属性(由Field对象表示),这三个类都定义在java.lang.reflect包下。程序可以通过Constructor对象来调用对应的构造器创建对象实例,可以通过Method对象来执行对应的方法,通过Field对象直接访问或修改对象的属性值。

2.1 运行时生成类的实例

通过反射生成对象有如下两种方式:

(1)通过Class的newInstance()方法

使用Class对象的newInstance()方法来创建该Class对象对应类的实例。这种方法要求该Class对象的对应类有无参构造方法,而执行newInstance()实际上就是执行无参构造方法来创建该类的实例。

此种方法比较常用,因为在很多JavaEE框架中都需要根据配置文件信息来创建Java对象,从配置文件读取的只是某个类的字符串类名,程序就需要根据该字符串来创建对应的实例,此时必须使用反射。

(2)通过Constructor的newInstance()方法

先使用Class对象获取指定的Constructor对象,在调用Constructor对象的newInstance()方法来创建该Class对象对应类的实例。通过这种方法可以选择使用某个类的指定构造方法来创建实例。

从以上代码中可以看出,采用第二种方法创建类的实例需要如下三个步骤:

(1)获取该类的Class对象;

(2)利用Class对象的getConstructor()方法获取指定的构造器(准备一个Class[]作为该方法的参数类型);

(3)调用Constructor的newInstance()方法来创建相应类的对象(准备一个Object[]作为该方法的实参值)。

2.2 运行时变更与调用field值

通过Class对象的getFields()或者getField()方法可以获得该类所包括的全部Field属性或指定Field属性。Field提供了以下两组方法来访问属性:

>getXxx(Object obj):获取obj对象该Field的属性值。此处的Xxx对应8个基本数据类型,如果该属性类型是引用类型则直接使用get(Object obj)。

>setXxx(Object obj,Xxx val):将obj对象的该Field设置成val值。此处的Xxx对应8个基本数据类型,如果该属性类型是引用类型则直接使用set(Object obj,Object val)。

>setAccessible(Boolean flag):Field类从父类AccessibleObject中继承的方法。若flag为true,则取消属性的访问权限控制,即使private属性也可以进行访问;若flag为false,则取消属性的访问权限控制,private属性也可以进行访问。

3 运行时调用method

通过Class对象的getMethods()或者getMethod()方法可以获得该类所包括的全部方法或指定方法,这两个方法的返回值是Method[]或者Method。每个Method对象对应一个方法,获得Method对象后,就可以调用它的invoke()方法来调用对应方法。

Object invoke(Object obj,Object[]args):obj代表当前方法所属的对象的名字,args代表当前方法的参数列表,返回值Object是当前方法的返回值,即执行当前方法的结果。

4 运行时动态创建数组并操作数组元素

在java.lang.reflect包下还提供了一个Array类,该类包括一系列static方法,通过这些方法可以来动态地创建数组、给数组元素赋值、取出数组元素值等。

Array提供的主要方法如下:

>static Object newInstance(ClasscomponentType,int[]dimensions):创建一个具有指定组件类型和维度的新数组。

>static xxx getXxx(Object array,int index):以xxx形式返回指定数组对象array中第index个元素的值,其中xxx代表八个基本数据类型。如果元素类型是引用类型,则直接使用static Object get(Object array,int index)方法。

>static void setXxx(Object array,int index,xxx val):给数组对象array中第index个元素赋值val,其中xxx代表八个基本数据类型。如果元素类型是引用类型,则直接使用static void set(Object array,int index,Object val)方法。

5 反射的优点和缺点

反射是提高Java程序的灵活性和可扩展性至关重要的技术,它使得Java软件系统具有自适应能力,实现程序的动态演进。它提供一种动态链接程序组件的多功能方法,允许程序创建和控制任何类的对象(根据安全性限制),无需提前硬编码目标类。这些特性使得反射特别适用于创建以非常普通方式与对象协作的库。例如,反射经常在持续存储对象为数据库、XML或其它外部格式的框架中使用。Java反射非常有用,如软件测试、JavaBean、EJB等,它使类和数据结构能按名称动态检索相关信息,并允许在运行着的程序中操作这些信息。Java这一特性非常强大,并且是其它一些常用语言,如C、C++、Fortran等都不具备的。充分发掘Java中的这一特性,可以编写出灵活、低耦合、高重用的组件。目前许多流行的开源框架,例如Struts、Hibernate、Spring等,在实现过程中都采用了Java反射技术。

但反射有两个缺点。第一个是性能问题。用于字段和方法接入时反射要远慢于直接代码。使用反射基本上是一种解释操作,我们可以告诉JVM,希望做什么并且它满足我们的要求,这类操作总是慢于直接执行相同的操作。因此Java反射机制主要应用在对灵活性和扩展性要求很高的系统框架上,普通程序不建议使用。

另外一个缺点是使用反射会模糊程序内部实际要发生的事情。程序设计人员希望在源代码中看到程序的逻辑,反射等绕过了源代码的技术会带来维护问题。反射代码比相应的直接代码更复杂。解决这些问题的最佳方案是保守地使用反射———仅在它可以真正增加灵活性的地方———记录其在目标类中的使用。

6 结束语

反射是提高Java程序的灵活性和可扩展性至关重要的技术,它使得Java软件系统具有自适应能力,实现程序的动态演进,是Java成为动态语言的一个重要特性。理解Java反射技术的内部机制,对于我们理解目前流行的开源框架Struts、Hibernate、Spring等的实现机制是很有帮助的,同时在开发中应用Java反射技术,可以提高软件的灵活性、重用性,降低耦合性。

摘要:反射是指程序可以访问、检测和修改它本身状态或行为的一种能力。通过反射,Java程序可以加载一个运行时才得知名称的class,得到其完整内部信息,并创建其对象,或对其属性进行设值,或调用其方法。反射是提高Java程序的灵活性和可扩展性至关重要的技术,它使得Java软件系统具有自适应能力。

关键词:反射,构造器,属性,方法,数组

参考文献

[1]孙卫琴.Java网络编程精解[M].北京:电子工业出版社,2007,3.

[2]李刚.疯狂Java讲义[M].北京:电子工业出版社,2008,10.

[3]侯捷.Java反射机制[M].程序员,2004,10.

[4]尹松强,傅鹂·Java反射机制探究[J].软件导刊,2008,11.

上一篇:网上广播下一篇:基于网络下的作文教学