
类名.class 与 类名.this 详解
今天在看 PropertyPlaceholderConfigurer 源码时,突然看到一个 PropertyPlaceholderConfigurer.this.resolvePlaceholder 的用法,以前只知道有个 "类名.class" 的用法,今天才知道还有个 "类名.this"
类名.class
我们知道在 java 中,一个类在被加载的时候虚拟机就会自动的生成一个这个类的一个 Class 类型的 "类对象",每个类都对应着一个这样的类对象,通过这个 Class 类型的类对象,我们就能够使用 "内省与反射" 机制,访问一个类的信息,比如:对应类中的方法有哪些,成员域有哪些等等;获取一个类的 "类对象" 的方法之一就是通过使用 "类名.class" 这个方式返回一个 Class 类型的对象,其他的获取这个 Class 对象的方法如下:
利用对象调用 getClass() 方法获取该对象的 Class 实例
使用 Class 的静态方法 forName(),用类的名字获取一个 Class 实例
运用 "类名.class" 的方式获取 Class 实例,对基本数据类型的封装类,还可以采用 "类名.type" 来获取对应的基本数据类型的 Class 实例。
这个应该都比较熟了,就不过多介绍了,下面着重介绍一下 "类名.this"
类名.this
这个语法的应用主要有两个方面:
(1) 当在一个类的内部类中,如果需要访问外部类的方法或者成员域的时候,如果使用 "this.成员域" 调用的显然是内部类的域 ,如果我们想要访问外部类的域的时候,就要必须使用 "外部类.this.成员域"
public class PropertyPlaceholderConfigurer extends PlaceholderConfigurerSupport {
protected String resolvePlaceholder(String placeholder, Properties props, int systemPropertiesMode) {
String propVal = null;
if (systemPropertiesMode == SYSTEM_PROPERTIES_MODE_OVERRIDE) {
propVal = resolveSystemProperty(placeholder);
}
if (propVal == null) {
propVal = resolvePlaceholder(placeholder, props);
}
if (propVal == null && systemPropertiesMode == SYSTEM_PROPERTIES_MODE_FALLBACK) {
propVal = resolveSystemProperty(placeholder);
}
return propVal;
}
private class PropertyPlaceholderConfigurerResolver implements PlaceholderResolver {
private final Properties props;
private PropertyPlaceholderConfigurerResolver(Properties props) {
this.props = props;
}
@Override
public String resolvePlaceholder(String placeholderName) {
return PropertyPlaceholderConfigurer.this.resolvePlaceholder(placeholderName, props, systemPropertiesMode);
}
}
}
内部类 PropertyPlaceholderConfigurerResolver 在 resolvePlaceholder 方法中调用外部类的方法为 PropertyPlaceholderConfigurer.this.resolvePlaceholder
(2) 还有一个使用情况,那就是在是使用意图更加的清楚
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(MainActivity.this , OtherActivity.class) ;
}
}