反射(二)Class对象获取的三种方式和通过反射实例化对象的两种方式

1.Class对象获取的三种方式
上一章节已经说过,一般情况下,Java反射操作都需要首先获取Class对象。获取Class对象的方式有三种。

公有属性class
方法getClass()
Class.forName()
下面是示例代码:

/**
 * <p>Title: Java获取Class对象的三种方式</p>
 * @author 韩超 2018/2/24 13:56
 */
public class ReflectClassDemo {
    /** log4j */
    private static final Logger LOGGER = Logger.getLogger(ReflectClassDemo.class);
    /**
    * <p>获取Class对象的三种方式</p>
    * @author hanchao
    */
    public static void main(String[] args) throws ClassNotFoundException {
        LOGGER.info("获取Class对象方式01:类的public属性class");
        Class clazz1 = User.class;
        LOGGER.info(clazz1);

        System.out.println();
        LOGGER.info("获取Class对象方式02:类的public方法getClass()");
        User user = new User();
        Class clazz2 = user.getClass();
        LOGGER.info(clazz2);

        System.out.println();
        LOGGER.info("获取Class对象方法03:Class.forName(需要抛出异常)");
        Class clazz3 = Class.forName("pers.hanchao.reflect.common.User");
        LOGGER.info(clazz3);
    }
}



运行结果:

2018-02-24 13:59:06 INFO  ReflectClassDemo:18 - 获取Class对象方式01:类的public属性class
2018-02-24 13:59:06 INFO  ReflectClassDemo:20 - class pers.hanchao.reflect.common.User

2018-02-24 13:59:06 INFO  ReflectClassDemo:23 - 获取Class对象方式02:类的public方法getClass()
2018-02-24 13:59:06 INFO  ReflectClassDemo:26 - class pers.hanchao.reflect.common.User

2018-02-24 13:59:06 INFO  ReflectClassDemo:29 - 获取Class对象方法03:Class.forName(需要抛出异常)
2018-02-24 13:59:06 INFO  ReflectClassDemo:31 - class pers.hanchao.reflect.common.User



总结:

通过公有属性class获取Class对象:通过类获取,无需创建类对象。
通过方法getClass()获取Class对象:需要类的对象。常用于不知道类名但是能获取对象的情况下。
通过方法Class.forName()获取Class对象:需要类的全名,需抛出异常。常用于加载配置。
2.通过反射实例化对象的两种方式
除了通过new实例化对象,我们还可以通过反射实例化对象对象,有两种方式:

Class.newInstance()
Constructor.newInstance()
下面是示例代码:

/**
 * 通过反射创建对象的两种方式
 * Created by 韩超 on 2018/2/24.
 */
public class CreateObjectDemo {
    private final static Logger LOGGER = Logger.getLogger(CreateObjectDemo.class);

    /**
     * <p>Title: 通过反射创建对象的两种方式</p>
     * @author 韩超 2018/2/24 14:11
     */
    public static void main(String[] args) throws Exception {
        //通过new实例化对象
        User user = new User();
        LOGGER.info("通过new实例化对象:" + user.toString());

        //通过反射实例化对象
        Class userClass = User.class;
        //通过反射实例化对象01-Class.newInstance()(需要强制类型转换[无参构造])
        User user1 = (User) userClass.newInstance();
        LOGGER.info("通过反射实例化对象01-Class.newInstance()(需要强制类型转换[无参构造]):" + user1.toString());
        //通过反射实例化对象02-Constructor.newInstance()(需要强制类型转换[可带参数])
        Constructor constructor = userClass.getDeclaredConstructor();
        User user2 = (User) constructor.newInstance();
        LOGGER.info("通过反射实例化对象02-Constructor.newInstance()(需要强制类型转换[无参构造]):" + user2.toString());
        Constructor constructor1 = userClass.getDeclaredConstructor(String.class,String.class);
        User user3 = (User) constructor1.newInstance("李四","000000");
        LOGGER.info("通过反射实例化对象02-Constructor.newInstance()(需要强制类型转换[有参构造]):" + user3.toString());
    }
}


运行结果:

2018-02-24 14:23:29 INFO  CreateObjectDemo:22 - 通过new实例化对象:User{username='张三', password='123456'}
2018-02-24 14:23:29 INFO  CreateObjectDemo:27 - 通过反射实例化对象01-Class.newInstance()(需要强制类型转换[无参构造]):User{username='张三', password='123456'}
2018-02-24 14:23:29 INFO  CreateObjectDemo:31 - 通过反射实例化对象02-Constructor.newInstance()(需要强制类型转换[无参构造]):User{username='张三', password='123456'}
2018-02-24 14:23:29 INFO  CreateObjectDemo:34 - 通过反射实例化对象02-Constructor.newInstance()(需要强制类型转换[有参构造]):User{username='李四', password='000000'}



总结:

通过Class.newInstance()进行对象实例化:实际调用的是无参数的构造函数进行实例化。
通过Constructor.newInstance()进行对象实例化:可以选择调用哪个构造函数进行实例化。
 

上一篇:JAVA反射调用方法


下一篇:同城艺龙2018秋招Java笔试之newInstance()