美文网首页
Class对象

Class对象

作者: 打铁大师 | 来源:发表于2017-08-12 12:52 被阅读0次

    [ API] java.lang.Class 1.0

    • static Class forName(String className)
      返回描述类名为className的Class对象。

    • String getName()
      返回类的全限定的类名(包含包名)。

    • String getSimpleName()
      返回不含包名的类名

    • String getCanonicalName()
      返回全限定的类名

    实例Test.java:

    class Dog  {
        static {
            System.out.println("我被加载了");
        }
    }
    public class Test {
        public static void main(String[] args) {
            Class c = null;
            try {
                 c = Class.forName("com.test.Dog");
                System.out.println(c.getName());
                System.out.println(c.getSimpleName());
                System.out.println(c.getCanonicalName());
            }catch (ClassNotFoundException e){
                System.exit(1);
            }
            try{
                Class.forName("com.test.Dog");
            }catch (ClassNotFoundException e){
                System.exit(1);
            }
        }
    }
    

    输出:

    我被加载了
    com.test.Dog
    Dog
    com.test.Dog
    

    forName()是取得Class对象的引用的一种方法。第二个try语句没有输出任何结果,说明,如果类Dog还没有被加载就会加载它,如果加载了就不会再次加载。

    [API] java.lang.Object 1.0

    • Class getClass()
      返回表示该对象的实际类型的Class引用

    实例Test.java:

    class Dog  {
        static {
            System.out.println("我被加载了");
        }
    }
    public class Test {
        public static void main(String[] args) {
            Dog dog= new Dog();
            Class c1 = dog.getClass();
            System.out.println(c1.getName());
            System.out.println(c1.getSimpleName());
            System.out.println(c1.getCanonicalName());
        }
    }
    

    上述代码表明,当我们知道了某个类型的具体对象后,那就可以通过调用getClass()方法来获取Class引用了。它是属于Object类的一部分。

    [ API] java.lang.Class 1.0

    • Class[] getInterfaces()
      返回的是这个Class对象实现的接口的Class对象数组。

    • boolean isInterface()
      返回这个Class对象是否表示一个接口。返回的是基类,而不是接口。

    • Object newInstance()
      返回这个类的新实例。返回的是一个Object引用,但是这个引用指向这个类的类型对象。使用newInstance()来创建的类,必须带有默认的构造器。

    • Class getSuperClass()
      返回你可以用来进一步查询的Class对象。

    实例Test.java:

     interface Run {
        void run();
    }
    
    interface Jump {
        void jump();
    }
    
    class Person {
        private String name = "defaultName";
        private int age = 0;
    
        Person() {}
    
        Person(String name, int age) {
          this.name = name;
          this.age = age;
      }
        public String getName(){
            return name;
      }
        public int getAge(){
            return age;
        }
    }
    
    class Sportsman extends Person implements Run, Jump {
        Sportsman(String name, int age) {
            super(name, age);
        }
    
        public void run() {
    
        }
    
        public void jump() {
    
        }
    }
    
    public class Test {
        public static void main(String[] args) {
            Sportsman sportsman = new Sportsman("noshower", 22);
            Class c1 = sportsman.getClass();
            Class c2 = null;
            try {
                c2 = Class.forName("com.test.Jump");
            } catch (ClassNotFoundException e) {
                System.exit(1);
            }
    
            System.out.println("c1 is interface? " + c1.isInterface());
            System.out.println("c2 is interface? " + c2.isInterface());
            Class[] cc = c1.getInterfaces();
            for (Class face : cc) {
                System.out.println("face name is " + face.getName());
            }
            Class parent = c1.getSuperclass();
            System.out.println("parent is " + parent.getName());
            Object obj = null;
            try {
                obj = parent.newInstance();
            }catch (InstantiationException e){
                System.exit(1);
            }catch (IllegalAccessException e){
                System.exit(1);
            }
            System.out.println(" name is "+((Person)obj).getName()+"age is "+((Person) obj).getAge());
        }
    }
    

    输出:

    c1 is interface? false
    c2 is interface? true
    face name is com.test.Run
    face name is com.test.Jump
    parent is com.test.Person
     name is defaultNameage is 0
    

    类字面量语法

    生成对Class对象的引用,即使用类字面常量。就像下面这样:

    FancyToy.class
    

    类字面常量不仅可以应用于普通的类,也可以应用于接口、数组以及基本数据类型。另外基本数据类型的包装器类,还有一个标准的字段TYPE。TYPE字段是一个引用,指向对应的基本数据类型Class对象。如下所示:

    ..... 等介于....
    boolean.class Boolean.TYPE
    char.class Character.TYPE
    byte.class Byte.TYPE
    short.class Short.TYPE
    int.class Integer.TYPE
    long.class Long.TYPE
    float.class Float.TYPE
    double.class Double.TYPE
    void.class Void.TYPE

    注意:当使用".class"来创建对Class对象的引用时,不会自动地初始化该Class对象。

    初始化被延迟到了对静态方法或非常数静态域进行首次引用时才执行。

    相关文章

      网友评论

          本文标题:Class对象

          本文链接:https://www.haomeiwen.com/subject/gntdrxtx.html