简介 Class

一个Class物件代表了Java应用程式在运行时所载入的类别或介面,也用来表达enum(属于类别的一种)、 annotation(属于介面的一种)、阵列、原生型态(primitive type)、void。
Class没有公开(public)的建构函式,Class物件是由JVM自动产生,每当一个类别被载入时,JVM就自动为其生成一个Class物件。
您可以透过Object的getClass()来取得每一个物件对应的Class物件,或者是透过class常量(Class literal),下面这个程式简单的使用getClass()方法来取得String类别的一些基本资讯:
  • ClassDemo.java
    package onlyfun.caterpillar;
    public class ClassDemo {
        public static void main(String[] args) {
            String name = "caterpillar";
            Class stringClass = name.getClass();
            System.out.println("getName: " +  stringClass.getName());
            System.out.println("isInterface: " +  stringClass.isInterface());
            System.out.println("isPrimitive: " +  stringClass.isPrimitive());
            System.out.println("isArray: " + stringClass.isArray());
            System.out.println("SuperClass: " +  stringClass.getSuperclass().getName());
        }
    }
    执行结果:
    getName: java.lang.String
    isInterface: false
    isPrimitive: false
    isArray: false
    SuperClass: java.lang.Object
    您也可以直接使用以下的方式来取得String类别的Class物件:
    Class stringClass = String.class;
    在Java中,阵列也属于一个类别,也有对应的Class物件,这个物件是由所有具相同元素与维度的阵列所共用,而原生型态像是boolean, byte, char, short, int, long, float, double以及关键字void,也都有对应的Class物件,您也都可以用类别常量(Class literal)来取得这些物件,例如:
  • ClassDemo.java
    public class ClassDemo {
        public static void main(String[] args) {
            System.out.println(boolean.class.getName());
            System.out.println(boolean.class.isPrimitive());
            System.out.println(void.class.getName());
        }
    }
    执行结果:
    boolean
    true
    void
    在一些应用中,您无法事先知道使用者将载入什么类别,您可以使用Class的forName()方法实现动态加载类别,下面这个例子让您可以指定类别名称来获得类别的相关资讯:
  • ClassDemo.java
    package onlyfun.caterpillar;
    public class ClassDemo {
        public static void main(String[] args) {
            try {
                Class c = Class.forName(args[0]);
                System.out.println("getName: " + c.getName());
                System.out.println("isInterface: " +c.isInterface());
                System.out.println("isPrimitive: " +c.isPrimitive());
                System.out.println("isArray: " + c.isArray());
                System.out.println("SuperClass: " +  c.getSuperclass().getName());
            }
            catch(ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    }
    执行结果:
    java ClassDemo java.util.ArrayList
    getName: java.util.ArrayList
    isInterface: false
    isPrimitive: false
    isArray: false
    SuperClass: java.util.AbstractList
    Class物件的讯息是在编译时期就被加入至.class档案中,它是Java支援执行时期型别辨识(RTTI,Run- Time Type Information或Run-Time Type Identification)的一种方式,在编译时期编译器会先检查对应的.class档案,而执行时期JVM在没有用到该类别时,就不会载入它,如果要用到时,JVM会先检查对应的Class物件是否已经载入,如果没有载入,则会寻找对应的.class档案并载入它。
    您可以使用Class.forName()方法动态加载类别,之后使用Class的newInstance()方法产生实例,下面这个程式是个简单的示范,您可以动态载入实现List的类别 :
  • ClassDemo.java
    package onlyfun.caterpillar;
    import java.util.*;
    public class ClassDemo {
        public static void main(String[] args) {
            try {
                Class c = Class.forName(args[0]);
                List list = (List) c.newInstance();
                for(int i = 0; i < 10; i++) {
                    list.add("element " + i);
                }
                for(Object o: list.toArray()) {
                    System.out.println(o);
                }
            }
            catch(ClassNotFoundException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }
    执行结果:
    java ClassDemo java.util.ArrayList
    element 0
    element 1
    element 2
    element 3
    element 4
    element 5
    element 6
    element 7
    element 8
    element 9   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值