Java的反射机制1——实例化一个对象

时间:2021-09-27 09:21:05
看了一下Java OOP的项目,在创建门禁卡登录类别时可以用工厂模式来实现;但后来又考虑了一下在应用工厂模式的同时可以应用Java的反射机制,Java反射的概念我个人认为很不好理解,通过例子才能融会贯通;其实理解Java的反射和理解JavaScript的eval函数一样,都是将一个字符型数据转换为相应的类、属性和方法;通过下面的例子来熟悉一下Java的反射;
       首先定义一个教员类,如下:
//教员类
public class AccpTeacher {
    private String name;

    private int age;

    public AccpTeacher() {
        name = "无名氏";
        age = 22;
    }

    public AccpTeacher(String name) {
        this.name = name;
        this.age = 22;
    }

    public String toString() {
        return "名字是:" + name;
    }

    public String toString(int age, String name) {
        this.name = name;
        this.age = age;
        return "名字是:" + name + ";年龄是:" + age;
    }
}

       如果我们实例化这个类可以用我们常用的如下方式:
public static void main(String[] args){
    AccpTeacher accpTeacher = new AccpTeacher();
    System.out.println(accpTeacher);
}
       可以清晰的想到运行结果是: 名字是:无名氏
       以上是我们最常用的方式,但有时我们想通过字符串来实例化一个类如何做呢,看下面代码:
public static void main(String[] args){
    // 实例化一个类
    Object accpTeacher = Class.forName(AccpTeacher.class.getName()).newInstance();
    System.out.println(accpTeacher);
}
       运行结果同样是: 名字是:无名氏
       首先Class.forName(类名)是将这个类加载到JVM虚拟机中,获得一个类型为Class的类,然后调用其newInstance()方法,相当于实例化(调用无参的构造函数);所以以上两段代码的运行效果是一致的。
       我们看到AccpTeacher这个类有一个带参数的构造方法,那如何通过反射来调用它呢?看下面代码:
public static void main(String[] args){
    // 通过构造方法实例化一个类;本例是一个有参数的构造函数,并且构造函数可以为private修饰
    Class[] argtype = new Class[] { String.class };//代表构造方法的参数类型数组
    Object[] argparam = new Object[] { "张三" };//代表构造方法的参数值数组
    Class classType = Class.forName(AccpTeacher.class.getName());
    Constructor constructor = classType.getDeclaredConstructor(argtype); //获得构造方法,argtype是参数类型数组,我们这里代表的是参数只有一个String类型
    constructor.setAccessible(true);// 访问私有构造函数,Spring可以配置私有的属性和方法,其实就是用到的这里
    Object accpTeacher2 = constructor.newInstance(argparam);
    System.out.println(accpTeacher2);
}

原文地址:http://blog.sina.com.cn/s/blog_754c6dff0100s81d.html