reverse_xiaoyu

忘记并不可怕,可怕的是你从来就都不知道!

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

1.Class对象获取的三种方式

本文转载自:https://blog.csdn.net/hanchao5272/article/details/79361463

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

  1. 公有属性class
  2. 方法getClass()
  3. Class.forName()

下面是示例代码:

 1 /**
 2  * <p>Title: Java获取Class对象的三种方式</p>
 3  */
 4 public class ReflectClassDemo {
 5     /** log4j */
 6     private static final Logger LOGGER = Logger.getLogger(ReflectClassDemo.class);
 7     /**
 8     * <p>获取Class对象的三种方式</p>
 9     */
10     public static void main(String[] args) throws ClassNotFoundException {
11         LOGGER.info("获取Class对象方式01:类的public属性class");
12         Class clazz1 = User.class;
13         LOGGER.info(clazz1);
14 
15         System.out.println();
16         LOGGER.info("获取Class对象方式02:类的public方法getClass()");
17         User user = new User();
18         Class clazz2 = user.getClass();
19         LOGGER.info(clazz2);
20 
21         System.out.println();
22         LOGGER.info("获取Class对象方法03:Class.forName(需要抛出异常)");
23         Class clazz3 = Class.forName("pers.hanchao.reflect.common.User");
24         LOGGER.info(clazz3);
25     }
26 }

 

运行结果:

1 ReflectClassDemo:18 - 获取Class对象方式01:类的public属性class
2 ReflectClassDemo:20 - class pers.hanchao.reflect.common.User
3 
4 ReflectClassDemo:23 - 获取Class对象方式02:类的public方法getClass()
5 ReflectClassDemo:26 - class pers.hanchao.reflect.common.User
6 
7 ReflectClassDemo:29 - 获取Class对象方法03:Class.forName(需要抛出异常)
8 ReflectClassDemo:31 - class pers.hanchao.reflect.common.User

 

2.通过反射实例化对象的两种方式

除了通过new实例化对象,我们还可以通过反射实例化对象对象,有两种方式:

  1. Class.newInstance()
  2. Constructor.newInstance()

下面是示例代码:

 1 /**
 2  * 通过反射创建对象的两种方式
 3  */
 4 public class CreateObjectDemo {
 5     private final static Logger LOGGER = Logger.getLogger(CreateObjectDemo.class);
 6 
 7     /**
 8      * <p>Title: 通过反射创建对象的两种方式</p>
 9      */
10     public static void main(String[] args) throws Exception {
11         //通过new实例化对象
12         User user = new User();
13         LOGGER.info("通过new实例化对象:" + user.toString());
14 
15         //通过反射实例化对象
16         Class userClass = User.class;
17         //通过反射实例化对象01-Class.newInstance()(需要强制类型转换[无参构造])
18         User user1 = (User) userClass.newInstance();
19         LOGGER.info("通过反射实例化对象01-Class.newInstance()(需要强制类型转换[无参构造]):" + user1.toString());
20         //通过反射实例化对象02-Constructor.newInstance()(需要强制类型转换[可带参数])
21         Constructor constructor = userClass.getDeclaredConstructor();
22         User user2 = (User) constructor.newInstance();
23         LOGGER.info("通过反射实例化对象02-Constructor.newInstance()(需要强制类型转换[无参构造]):" + user2.toString());
24         Constructor constructor1 = userClass.getDeclaredConstructor(String.class,String.class);
25         User user3 = (User) constructor1.newInstance("李四","000000");
26         LOGGER.info("通过反射实例化对象02-Constructor.newInstance()(需要强制类型转换[有参构造]):" + user3.toString());
27     }
28 }

 

运行结果:

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

 

总结:

  1. 通过Class.newInstance()进行对象实例化:实际调用的是无参数的构造函数进行实例化。
  2. 通过Constructor.newInstance()进行对象实例化:可以选择调用哪个构造函数进行实例化。
posted on 2019-11-11 19:31  Reverse-xiaoyu  阅读(578)  评论(0编辑  收藏  举报