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

看了一下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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值