重复调用实例化对象

自动任务中循环定时发送邮件给不同人员时报重复调用实例化对象

报错:
[ 2017-11-16 01:40:43 ] Starting!
Fatal error: Uncaught exception 'Zend_Mail_Exception' with message 'Subject set twice' in /var/www/CFF/admin/libs/Zend/Mail.php:933
Stack trace:
#0 /var/www/CFF/admin/application/modules/product/services/Receiving.php(1986): Zend_Mail->setSubject('???????????????...')
#1 /var/www/CFF/admin/run/qcGroupReceivingAndBacklogReport.php(25): Product_Service_Receiving::addresseeEmail('2017-11-01 00:0...', '2017-11-15', 4)
#2 {main}
  thrown in /var/www/CFF/admin/libs/Zend/Mail.php on line 933

源码:
$Object = new Product_Service_Receiving();
foreach ($warehouseId as $value) {
    $Object->addresseeEmail($start_date, $end_dates, $value);
}
$content = iconv("UTF-8", "GBK", $content);
$mail_subject = "仓库质检组收货及积压报表 ";
$mail = Cff::setupMail();
$mail->setBodyHtml("");
$mail->addTo($email, $mail_subject);
$mail->setSubject($mail_subject);
$at = $mail->createAttachment($content);
$at->type = "application/vnd.ms-excel";
$at->disposition = Zend_Mime::DISPOSITION_INLINE;
$at->encoding = Zend_Mime::ENCODING_8BIT;
$at->filename = iconv("UTF-8", "GBK", $mail_subject . date("Y-m-d") . ".csv");
$mail->send();

解决方法:
    解决实例化调用
    把 
    $mail = Cff::setupMail(); 
    更换为
    $mail = Product_Service_ReceivingItem::setupMail();
<think>嗯,用户想了解如何使用Java反射机制来实例化对象,并希望看到示例代码。首先,我需要回忆一下反射的基本概念和步骤。反射允许程序在运行时动态获取类的信息并操作类的方法和属性。实例化对象通常需要获取类的Class对象,然后通过构造方法创建实例。根据引用[2],提到通过反射可以获取Class对象,然后获取构造方法并创建实例。引用[3]中的动态创建对象部分也相关。用户可能需要基本示例,包括无参和有参构造函数的处理。同时要考虑异常处理,比如ClassNotFoundException或NoSuchMethodException,这些在代码中需要用try-catch块包裹。另外,引用[5]提到了Class.forName的不同用法,特别是是否初始化类。可能需要解释forName方法的不同参数,尤其是initialize参数的作用,但用户的问题可能更关注基础用法,所以示例中可能使用简单的forName(String)形式。用户可能还需要了解如何访问私有构造方法,这在某些情况下是必要的。引用[3]提到访问私有方法,所以应该包括如何使用setAccessible方法来突破访问限制。这可能会涉及安全管理器的问题,但一般情况下示例代码可以展示这个过程。还需要考虑代码的正确性,比如正确获取构造方法并传递参数。例如,有参构造需要指定参数类型,如String.class,然后调用newInstance时传入实际参数值。同时,需要处理InstantiationException和IllegalAccessException等异常。最后,整理步骤:获取Class对象、获取Constructor、调用newInstance。需要分情况讨论无参、有参、私有构造方法,并给出对应的代码示例。同时,要提醒性能和安全问题,如引用[4]提到的性能瓶颈和安全风险,但用户的问题主要是如何实例化,所以这部分可以作为注意事项补充。</think>### Java反射机制实例化对象分步说明 #### 一、基础实例化流程(无参构造) 1. **获取Class对象** ```java Class<?> clazz = Class.forName("com.example.Person"); ``` 2. **获取无参构造方法** ```java Constructor<?> constructor = clazz.getConstructor(); ``` 3. **创建对象实例** ```java Object instance = constructor.newInstance(); ``` 完整示例代码: ```java try { Class<?> clazz = Class.forName("com.example.Person"); Constructor<?> constructor = clazz.getConstructor(); Object obj = constructor.newInstance(); System.out.println(obj.getClass().getName()); } catch (ClassNotFoundException | NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e) { e.printStackTrace(); } ``` #### 二、带参数构造方法实例化 ```java try { Class<?> clazz = Class.forName("com.example.Employee"); // 指定参数类型(String.class, int.class) Constructor<?> constructor = clazz.getConstructor(String.class, int.class); // 传入实际参数值 Object obj = constructor.newInstance("张三", 25); } catch (Exception e) { e.printStackTrace(); } ``` #### 三、私有构造方法实例化 ```java try { Class<?> clazz = Class.forName("com.example.Singleton"); // 获取私有构造方法 Constructor<?> constructor = clazz.getDeclaredConstructor(); // 突破访问限制 constructor.setAccessible(true); Object obj = constructor.newInstance(); } catch (Exception e) { e.printStackTrace(); } ``` #### 四、注意事项 1. **类初始化控制**:使用`Class.forName`重载方法可控制类初始化 ```java Class.forName("com.example.Demo", false, getClass().getClassLoader()) ``` 2. **性能优化**:重复实例化时建议缓存`Constructor`对象(反射调用比直接调用慢约10-20倍[^4]) 3. **安全管理**:需处理`SecurityException`,私有方法访问可能被安全管理器阻止
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值