zoukankan      html  css  js  c++  java
  • Java反射机制demo(二)—通过Class实例化任意类的对象

     Java反射机制demo(二)—通过Class实例化任意类的对象

    上一章节中,实例化了Class类对象的实例,这个部分的demo展示了如何使用Class对象的实例去获得其他类的对象的实例。

    任意一个类,UserInfo,

     1 package com.aaron.reflect;
     2 
     3 public class UserInfo{
     4     private int userId;
     5     private String name;
     6     private int age;
     7     
     8     public int getUserId() {
     9         return userId;
    10     }
    11     public void setUserId(int userId) {
    12         this.userId = userId;
    13     }
    14     public String getName() {
    15         return name;
    16     }
    17     public void setName(String name) {
    18         this.name = name;
    19     }
    20     public int getAge() {
    21         return age;
    22     }
    23     public void setAge(int age) {
    24         this.age = age;
    25     }
    26     @Override
    27     public String toString() {
    28         return "UserInfo [userId=" + userId + ", name=" + name + ", age=" + age + "]";
    29     }
    30     
    31 }
    32  

     使用newInstance方法,通过调用默认的无参构造来实例化一个UserInfo的对象

     1 package com.aaron.reflect;
     2 
     3 public class Demo1 {
     4     public static void main(String[] args) {
     5         Class<?> c = UserInfo.class;//获得Class类实例
     6         UserInfo userInfo = null;
     7         
     8         try {
     9             userInfo = (UserInfo) c.newInstance();//通过Class类的实例获得UserInfo的实例
    10         } catch (InstantiationException e) {
    11             e.printStackTrace();
    12         } catch (IllegalAccessException e) {
    13             e.printStackTrace();
    14         }
    15         
    16         userInfo.setUserId(1);
    17         userInfo.setName("Squee,Spleen and Goblin");
    18         userInfo.setAge(10);
    19         
    20         System.out.println(userInfo);
    21     }
    22 }
    23  

     如果了解Java虚拟机,应该知道,一个对象在new之前,堆里是不会分配内存的。因此这个UserInfo的实例是通过Class的实例得到的。

    运行结果:

    UserInfo [userId=1, name=Squee,Spleen and Goblin, age=10]
    

    注意事项:

    newInstance()调用的是无参的空构造,如果只有参数的构造函数:如下:

    private int userId;
    private String name;
    private int age;
    	
    public UserInfo(int userId, String name, int age) {
    	super();
    	this.userId = userId;
    	this.name = name;
    	this.age = age;
    }
    

    运行Demo,抛出异常:

    java.lang.InstantiationException: com.aaron.reflect.UserInfo
    at java.lang.Class.newInstance(Class.java:359)
    at com.aaron.reflect.Demo1.main(Demo1.java:9)
    Exception in thread "main" java.lang.NullPointerException
    at com.aaron.reflect.Demo1.main(Demo1.java:16
    

    此时,要定义一个空的构造函数(显式地声明一个空的构造函数)。 

    所以,显式声明空的构造函数有时候也是一种很好的习惯。当你要使用反射时,一定不要忘记空的构造。

  • 相关阅读:
    两个栈实现一个队列
    DacningLinks实现
    boost::implicit_cast
    hibernate查询之Criteria实现分页方法(GROOVY语法)
    VS2015 android 设计器不能可视化问题解决。
    当Eclipse爱上SVN
    你不知道的getComputedStyle
    推荐的软件
    React之表单
    理解javascript中的Function.prototype.bind
  • 原文地址:https://www.cnblogs.com/AaronCui/p/4911479.html
Copyright © 2011-2022 走看看