最近好多天在考虑反射过程中遇到的一些问题。我们知道反射的强大,但是反射能不能完全的还原这个类呢,比如说类中的静态代码块,根据sun公司提供的api恐怕是难以做到这一点,那么在sun的底层对其进行封装的同时应该会将静态代码块什么的包装起来的么?
这些天在考虑这个问题翻看了一些源代码,但是还是java基础不行的原因吧,收获不是太大,虽然有一些收获,但是不是我想要的。
在这个过程中无意中碰到一个问题,javax.lang.model目录结构如下(画的有点丑,大概是那个意思):看名字是描述了java语言模型
element目录
---->Element.java 文件
type目录
----->
util目录
SourceVersion.java文件
PS:顺便抱怨下黑马论坛的图片上传功能,根本就不能上传么。。一上传浏览器就罢工,让我这种没有网络相册的人好不方便。
在SourceVersion这个类中,描述了java历来的版本和当前最新的版本,我这个jdk是1.6的,而且还描述了java中所有的关键字,包括保留的比如
constant,部分代码如下
private final static Set<String> keywords;
static {
Set<String> s = new HashSet<String>();
String [] kws = {
"abstract", "continue", "for", "new", "switch",
"assert", "default", "if", "package", "synchronized",
"boolean", "do", "goto", "private", "this",
"break", "double", "implements", "protected", "throw",
"byte", "else", "import", "public", "throws",
"case", "enum", "instanceof", "return", "transient",
"catch", "extends", "int", "short", "try",
"char", "final", "interface", "static", "void",
"class", "finally", "long", "strictfp", "volatile",
"const", "float", "native", "super", "while",
"null", "true", "false"
};
for(String kw : kws)
s.add(kw);
keywords = Collections.unmodifiableSet(s);
}
在type.TypeKind这个类中,描述了java中所有的数据类型以及那八种基本数据类型,可以很清晰的看出java总共有多少种数据类型
public enum TypeKind {
BOOLEAN, BYTE, SHORT, INT, LONG, CHAR, FLOAT, DOUBLE, VOID, NONE, NULL, ARRAY, DECLARED,
ERROR, TYPEVAR, WILDCARD, PACKAGE, EXECUTABLE, OTHER;
public boolean isPrimitive() {
switch(this) {
case BOOLEAN:
case BYTE:
case SHORT:
case INT:
case LONG:
case CHAR:
case FLOAT:
case DOUBLE:
return true;
default:
return false;
}
}
}
在element.ElementKind这个类中描述了java语言中有多少元素,如静态代码块,构造代码块,构造器,参数,注解,异常等等都有描述。
并且我们可以很清晰的看到,枚举也是一个类,注解也是一种借口等。
public enum ElementKind {
PACKAGE, ENUM, CLASS, ANNOTATION_TYPE, INTERFACE, ENUM_CONSTANT, FIELD, PARAMETER, LOCAL_VARIABLE,
EXCEPTION_PARAMETER, METHOD, CONSTRUCTOR, STATIC_INIT, INSTANCE_INIT, TYPE_PARAMETER, OTHER;
public boolean isClass() {
return this == CLASS || this == ENUM;
}
public boolean isInterface() {
return this == INTERFACE || this == ANNOTATION_TYPE;
}
public boolean isField() {
return this == FIELD || this == ENUM_CONSTANT;
}
}
并且在tpye目录下还有一个祖先接口叫做TypeMirror的,它有一些子接口比如ReferenceType或者PrimitiveType,至此我感觉这个目录的的确确是用来描述java语言模型的。在element目录下有个祖先接口叫做Element的东西,它也有一些子接口比如TypeElement之类。
按照我的逻辑推断,java语言所使用的数据类型都应该是这些接口的一个实现。于是我满怀欣喜的去看,看看java.lang.Byte的声明
public final class Byte extends Number implements Comparable<Byte> {
先说明Comparable接口没有继承任何接口,我又查看了一些其它的数据类型的声明,结果是大同小异的
public final class Short extends Number implements Comparable<Short> {
这个结果和我预想的大不一样,我本以为代码应该类似于*** implements ByteType之类。
我在网上通过关键字javax.lang.model,发现有一些人写的文章也是说这个目录描述了java语言的模型。
那么,我的理解到底是哪里出问题了么?
还是说那套model根本就没啥用?
|
|