AVA反射(1)

来源:互联网 发布:mac装win8还是win10 编辑:程序博客网 时间:2024/06/05 16:42

0.简要说明
 Class类,表示Java的基础类型(类+基本类型),是对Java类的抽象,描述的是类的信息,包括类的修饰符(public/private/protect/default/static/final等)、类的类型(一般类、枚举、注释、接口、数组等)、类的构造器、类的字段、类的方法等信息。所以在看待Class相关问题的时候应该从所有类的共性这个角度去看。注意,这里的类不是平常我们说的狭义上的类(class),而是广义上,包括了像接口、注释、数组等类型的类,下面若不特殊声明,类代表着广义上的类。

1.类有哪些类型
1) 嵌套类,位于类内部,又分为:静态嵌套类和非静态嵌套类。
2) 静态嵌套类即为静态类。静态类只有这一种,技术来说,也可以看成静态成员类。
3) 非静态嵌套类即为内部类,又分为:成员类、局部类(本地类)、匿名类。
4) 成员类:位于类内部但不包括位于块、构造器、方法内,且有名称的类。
5) 局部类:位于块、构造器、方法内的有名称类。
6) 匿名类:类内无名称类,又可细分为:成员匿名类和局部匿名类。

public class ClassTest {     static class Inner{  //嵌套类      }      class Inner{  //嵌套类、内部类(非静态嵌套类)       }      public void test(){        class Local{  //局部类(本地类)        }        InterfaceA a = new InterfaceA() {};//局部匿名类     }    InterfaceA a = new InterfaceA() {};//成员匿名类private interface InterfaceA{}   }

2.Class类源码解析
1)forName
通过类的权限名加载类(也可指定类加载器),返回该类的Class对象:forName(String)和forName(String, boolean, ClassLoader)

2)newInstance
创建该Class对象对应的实例对象,但且限定该类拥有无构造方法才能成功,否则抛出异常

3)getClassLoader
获取该类的类加载器,在本JVM(Oracle HotSopt),当本类的类加载器是引导类加载器(bootStrap)则返回的是null。

4)getTypeParameters
返回该类中声明(定义)的类变量数组,例如:

    //关于TypeVariable详见注3    public class Main<K, V> {       public static void main(String[] args) throws Exception       {            Class cl = Main.class;         TypeVariable[] types = cl.getTypeParameters();           for(TypeVariable type : types){              System.out.print(type.getName()); //结果:K V           }      }    }

5)getSuperclass
获取Class对象的直接父类的Class对象;
如果该Class是基本类型(包括void,注意是小写的关键字void,不是大写的类Void)、接口、注释,则返回null
例子:
Class c0 = Main.class;//类,返回直接父类,泛型当做普通类处理,结果 : class java.lang.Object
Class c1 = EnumA.class;//枚举类型,默认继承Enum类,结果 : class java.lang.Enum
Class c2 = int.class;//基本类型返回null
Class c3 = int[].class;//结果 :class java.lang.Object
Class c4 = InterfaceB.class;//接口也是返回null
Class c5 = Deprecated.class;//注释类型也返回null,c5.isInterface() 为true

6)getGenericSuperclass
获得直接父类的类型,可以理解为在5的基础上,如果其是泛型,再获得其类型原型(但需要继承时显式表示)
例子:
public class Main

原创粉丝点击