几种创建类的实例

package com;

/**
 * 类型创建
 */
public class TypeCast {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        Class s=Class.forName("com.MyLogger");//获取类的引用
        System.out.println("s的类的全限定名称:"+s.getName());
        System.out.println("s的类的名称:"+s.getSimpleName());
        System.out.println("s的类的全限定名称:"+s.getCanonicalName());
        for(Class c:s.getInterfaces()){
            System.out.println("s的实现的接口:"+c.getCanonicalName());
        }
        System.out.println("s的父类:"+s.getSuperclass());
        Object o=s.newInstance();//创建类的实例对象
        if(o instanceof MyLogger){//instanceof 判断实例对象所属的类,若o属于 MyLogger的派生类,结果仍为true
            if(MyLogger.class.isInstance(o)){//使用类的引用的isInstance()比较与instanceof 等价,若o属于 MyLogger的派生类,结果仍为true
                System.out.println("使用类的引用的isInstance()比较某一个实例对象是否为同一个类型:"+true);
            }
            System.out.println("使用==比较类的引用是否为同一个类:"+ (o.getClass() == MyLogger.class));//比较类的引用是否为同一个类,相同为true,若o属于 MyLogger的派生类,结果为false
            System.out.println("使用equals()比较类的引用是否为同一个类:"+ (o.getClass().equals(MyLogger.class)));//此处与==等价,若o属于 MyLogger的派生类,结果为false

            MyLogger myLogger=(MyLogger)o;
            System.out.println("myLogger:"+myLogger.toString());
            Class s1=o.getClass();//通过对象实例获得类的引用
            System.out.println("s1的类全限定名称:"+s1.getName());
            Class s2=MyLogger.class;//通过类本身的class获得类的引用
            System.out.println("s2的类全限定名称:"+s2.getName());
        }
        //获得泛型的具体的类引用,newInstance将返回对象的确切类型
        Class<MyLogger> s3=MyLogger.class;
        MyLogger myLogger1=s3.newInstance();
        System.out.println("myLogger1:"+myLogger1.toString());
        //使用?的泛型类引用,newInstance此时无法确定具体的类类型,仍需强转
        Class<?> s4=MyLogger.class;
        MyLogger myLogger2=(MyLogger)s4.newInstance();
        System.out.println("myLogger2:"+myLogger2.toString());
        //所有对象都可以通过new调用构造器创建类的对象实例
        MyLogger myLogger3=new MyLogger();
        System.out.println("myLogger3:"+myLogger3.toString());
    }
}

运行结果:

s的类的全限定名称:com.MyLogger
s的类的名称:MyLogger
s的类的全限定名称:com.MyLogger
s的父类:class java.lang.Object
使用类的引用的isInstance()比较某一个实例对象是否为同一个类型:true
使用==比较类的引用是否为同一个类:true
使用equals()比较类的引用是否为同一个类:true
myLogger:com.MyLogger@6d6f6e28
s1的类全限定名称:com.MyLogger
s2的类全限定名称:com.MyLogger
myLogger1:com.MyLogger@135fbaa4
myLogger2:com.MyLogger@45ee12a7
myLogger3:com.MyLogger@330bedb4

转载于:https://my.oschina.net/langwanghuangshifu/blog/1935816