Java
日常 记录
作者: LinkSystem
Java
2017/04/27
对于Java的内部类,我们注意ClassName的表达方法:package.Classname$InnerClass,
其原因是内部类编译后是ClassName$InnerClass.class文件。
代码如下
public class ReflectExplain {
static class Node{
public double i;
public int x;
public Node() {
}
public Node(double i, int x) {
this.i = i;
this.x = x;
}
}
public static void main(String args[]) throws Exception {
String name = "com.link.core.reflect.ReflectExplain$Node";
Class clazz = Class.forName(name);
System.out.println(clazz);
}
}
同时,我们也可以通过Class的getDeclaredClasses方法,来获得指定类中的所有子类。在下面的代码中,可以在输出中获得子类的ClassName,如 com.link.core.reflect.ReflectExplain$Node, 也验证了上面的ClassName的写法。
代码如下
public class ReflectExplain {
static class Node{
public double i;
public int x;
public Node() {
}
public Node(double i, int x) {
this.i = i;
this.x = x;
}
}
public static void main(String args[]) throws Exception {
String name = "com.link.core.reflect.ReflectExplain";
Class clazz = Class.forName(name);
Class[] clazzes = clazz.getDeclaredClasses();
for (Class object : clazzes){
System.out.println(object);
}
}
}
接着来看一下java.lang.reflect中的Modifier。在Class中有getModifiers()这一方法,其返回值是int值,在Class类中是这样描述的
Returns the Java language modifiers for this class or interface, encoded in an integer.
The modifiers consist of the Java Virtual Machine's constants for {@code public}, {@code protected}, {@code private}, {@code final}, {@code static}, {@code abstract} and {@code interface}; they should be decoded using the methods of class {@code Modifier}.
大致的意思是每一个修饰符都有一个对应的int值,在可以在Modifier类中匹配,所以可以
看Modifier类中的方法,可见其中有 is() 的方法和toString()的方法,以下是is()的代码和toString()的代码:
public static final int PUBLIC = 0x00000001;
public static boolean isPublic(int mod) {
return (mod & PUBLIC) != 0;
}
public static String toString(int mod) {
StringBuilder sb = new StringBuilder();
int len;
if ((mod & PUBLIC) != 0) sb.append("public ");
if ((mod & PROTECTED) != 0) sb.append("protected ");
if ((mod & PRIVATE) != 0) sb.append("private ");
/* Canonical order */
if ((mod & ABSTRACT) != 0) sb.append("abstract ");
if ((mod & STATIC) != 0) sb.append("static ");
if ((mod & FINAL) != 0) sb.append("final ");
if ((mod & TRANSIENT) != 0) sb.append("transient ");
if ((mod & VOLATILE) != 0) sb.append("volatile ");
if ((mod & SYNCHRONIZED) != 0) sb.append("synchronized ");
if ((mod & NATIVE) != 0) sb.append("native ");
if ((mod & STRICT) != 0) sb.append("strictfp ");
if ((mod & INTERFACE) != 0) sb.append("interface ");
if ((len = sb.length()) > 0) /* trim trailing space */
return sb.toString().substring(0, len-1);
return "";
}
可见其原理都是一致的,通过与方式来判断是否为零,来返回相应的值。那么我们可以Modified类来实现某些应用。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。