Java语言基础:RTTI

发布时间:2011-3-29 19:34    发布者:1770309616
关键词: Java语言基础 , RTTI
Java语言基础.pdf (205.39 KB)


1.  每个类都有一个Class对象,当我们在运行期第一次生成类的实例时,JVM就加载这个类的Class对象,然后用这个Class对象来创建类实例;Class类似于Delphi中的引用类TClass,用于保存类的运行时信息。

2.  Class的static方法forName()用于查找某个类的Class对象,如果forName找不到你要的类的Class对象,会抛出ClassNotFoundException异常:
view plaincopy to clipboardprint?
01.class A{   
02.}   
03.   
04.public class Main {               
05.    public static void main(String[] args) {   
06.        try {   
07.            Class cls = Class.forName("A");   
08.            System.out.println(cls.getName());   
09.        } catch (ClassNotFoundException e) {   
10.            e.printStackTrace();   
11.        }   
12.    }   
13.}  
class A{
}

public class Main {            
    public static void main(String[] args) {
        try {
            Class cls = Class.forName("A");
            System.out.println(cls.getName());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}
3.  查找类的Class对象的另一个方法是直接调用类.class,这会在编译期就检查是否正确,因此不需要捕获异常:
view plaincopy to clipboardprint?
01.class A{   
02.}   
03.   
04.public class Main {               
05.    public static void main(String[] args) {   
06.        // 类有class关键字   
07.        Class acls = A.class;   
08.        System.out.println(acls.getName());   
09.        // 普通类型也有   
10.        Class icls = int.class;   
11.        System.out.println(icls.getName());   
12.    }   
13.}  
class A{
}

public class Main {            
    public static void main(String[] args) {
        // 类有class关键字
        Class
acls = A.class;
        System.out.println(acls.getName());
        // 普通类型也有
        Class icls = int.class;
        System.out.println(icls.getName());
    }
}
4.  判断两个对象是否属于同一个类,可以通过比较他们的class的方式,通过对象的getClass()方法可以得Class对象:
view plaincopy to clipboardprint?
01.class A{   
02.}   
03.class B extends A {   
04.}   
05.public class Main {               
06.    public static void main(String[] args) {   
07.        A a = new B();   
08.        B b = new B();   
09.        // a和b都B的实例,所以为true   
10.        if (a.getClass() == b.getClass())   
11.            System.out.print("yes");   
12.        else  
13.            System.out.print("no");   
14.    }   
15.}  
class A{
}
class B extends A {
}
public class Main {            
    public static void main(String[] args) {
        A a = new B();
        B b = new B();
        // a和b都B的实例,所以为true
        if (a.getClass() == b.getClass())
            System.out.print("yes");
        else
            System.out.print("no");
    }
}

5.  要判断对象是否继承或属于某个类,可以通过两个方法:1是使用instanceof关键字,2是使用Class.isInstance方法:
view plaincopy to clipboardprint?
01.class A{   
02.}   
03.class B extends A {   
04.}   
05.public class Main {               
06.    public static void main(String[] args) {   
07.        A a = new B();   
08.        B b = new B();   
09.        // 使用instanceof关键字,a是否A或其子类的对象   
10.        if (a instanceof A)   
11.            System.out.println("Yes");   
12.        // 使用instanceof关键字,b是否B或其子类的对象   
13.        if (b instanceof B)   
14.            System.out.println("Yes");   
15.        // 使用isInstance方法   
16.        if (A.class.isInstance(a))   
17.            System.out.println("Yes");   
18.        if (B.class.isInstance(a))   
19.            System.out.println("Yes");   
20.    }   
21.}  
class A{
}
class B extends A {
}
public class Main {            
    public static void main(String[] args) {
        A a = new B();
        B b = new B();
        // 使用instanceof关键字,a是否A或其子类的对象
        if (a instanceof A)
            System.out.println("Yes");
        // 使用instanceof关键字,b是否B或其子类的对象
        if (b instanceof B)
            System.out.println("Yes");
        // 使用isInstance方法
        if (A.class.isInstance(a))
            System.out.println("Yes");
        if (B.class.isInstance(a))
            System.out.println("Yes");
    }
}

6.  Class.NewInstance可以创建一个类实例,该类必须有默认构造函数,否则会抛出InstantiationException异常:
view plaincopy to clipboardprint?
01.class A{   
02.}   
03.public class Main {               
04.    public static void main(String[] args) {   
05.        try {   
06.            A a = A.class.newInstance();   
07.        } catch (InstantiationException e) {   
08.            e.printStackTrace();   
09.        } catch (IllegalAccessException e) {   
10.            e.printStackTrace();   
11.        }   
12.    }   
13.}  
class A{
}
public class Main {            
    public static void main(String[] args) {
        try {
            A a = A.class.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

7.  Class还提供了一些更强大的方法,可以得到类的更多信息,比如:getSuperclass: 取得父类的Class对象;getInterfaces: 取得实现的接口数组;还有其他很多方法。
本文地址:https://www.eechina.com/thread-60385-1-1.html     【打印本页】

本站部分文章为转载或网友发布,目的在于传递和分享信息,并不代表本网赞同其观点和对其真实性负责;文章版权归原作者及原出处所有,如涉及作品内容、版权和其它问题,我们将根据著作权人的要求,第一时间更正或删除。
您需要登录后才可以发表评论 登录 | 立即注册

厂商推荐

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表