spring 如何得到具体的实现类

[quote]

不用 spring 注入方式
[/quote]



package com.sunrun.console.service.impl;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import javax.annotation.Resource;

import org.junit.Test;
import org.springframework.aop.framework.AdvisedSupport;
import org.springframework.aop.framework.AopProxy;
import org.springframework.aop.support.AopUtils;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.sunrun.console.constant.SysCst;
import com.sunrun.console.service.ISettleService;
import com.sunrun.mpos.common.core.PropertiesHolder;

import org.junit.Assert;

public class SettleServiceImplTest{

@Test
public void suppose_bank_settle_no_is_null() throws Exception{

ApplicationContext act = new ClassPathXmlApplicationContext(new String[]{"config/console-context.xml"});
ISettleService settleService = (ISettleService)act.getBean(ISettleService.class);

SettleServiceImpl ssi = (SettleServiceImpl)getTargetObject(settleService);;

Method methodConfig = SettleServiceImpl.class.getMethod("configBankSettleNoAndName", StringBuffer.class);
methodConfig.setAccessible(true);

StringBuffer result = new StringBuffer("");

methodConfig.invoke(ssi, result);

System.out.println(result.toString());

System.out.println(PropertiesHolder.getValue(SysCst.SettleCst.SETTLE_BANK_NO));
System.out.println(PropertiesHolder.getValue(SysCst.SettleCst.SETTLE_BANK_NAME));

//String rs = "<bankSettleNo>888888888888</bankSettleNo><bankSettleName>中信银行上海分行营业部</bankSettleName>";
String rs = "<bankSettleNo>7332410182600005752</bankSettleNo><bankSettleName>中信10321325</bankSettleName>";

Assert.assertEquals(rs, result.toString());;


}

public static Object getTargetObject(Object proxy) throws Exception {

if(!AopUtils.isAopProxy(proxy)) { //判断是否是代理类
return proxy;
}

return getTargetObject(getProxyTargetObject(proxy));

}


private static Object getProxyTargetObject(Object proxy) throws Exception {
Field h = proxy.getClass().getSuperclass().getDeclaredField("h");
h.setAccessible(true);
AopProxy aopProxy = (AopProxy) h.get(proxy);
Field advised = aopProxy.getClass().getDeclaredField("advised");
advised.setAccessible(true);
return ((AdvisedSupport)advised.get(aopProxy)).getTargetSource().getTarget();
}

}





[quote]

spring 注入方式 , 继承 TestBase
[/quote]




package com.sunrun.tesbase;

import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import junit.framework.TestCase;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:config/console-context.xml" })
public class BaseTest extends TestCase {
protected Logger logger = LoggerFactory.getLogger(getClass());

}



package com.sunrun.console.service.impl;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import javax.annotation.Resource;

import org.junit.Test;
import org.springframework.aop.framework.AdvisedSupport;
import org.springframework.aop.framework.AopProxy;
import org.springframework.aop.support.AopUtils;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.sunrun.console.constant.SysCst;
import com.sunrun.console.service.ISettleService;
import com.sunrun.mpos.common.core.PropertiesHolder;
import com.sunrun.tesbase.BaseTest;

import org.junit.Assert;

public class SettleServiceImplTestWithBase extends BaseTest{

@Resource
private ISettleService settleService;


@Test
public void suppose_bank_settle_no_is_null() throws Exception{

SettleServiceImpl ssi = (SettleServiceImpl)getTargetObject(settleService);;

Method methodConfig = SettleServiceImpl.class.getMethod("configBankSettleNoAndName", StringBuffer.class);
methodConfig.setAccessible(true);

StringBuffer result = new StringBuffer("");

methodConfig.invoke(ssi, result);

System.out.println(result.toString());

System.out.println(PropertiesHolder.getValue(SysCst.SettleCst.SETTLE_BANK_NO));
System.out.println(PropertiesHolder.getValue(SysCst.SettleCst.SETTLE_BANK_NAME));

//String rs = "<bankSettleNo>888888888888</bankSettleNo><bankSettleName>中信银行上海分行营业部</bankSettleName>";
String rs = "<bankSettleNo>7332410182600005752</bankSettleNo><bankSettleName>中信10321325</bankSettleName>";

Assert.assertEquals(rs, result.toString());;


}

public static Object getTargetObject(Object proxy) throws Exception {

if(!AopUtils.isAopProxy(proxy)) { //判断是否是代理类
return proxy;
}

return getTargetObject(getProxyTargetObject(proxy));

}


private static Object getProxyTargetObject(Object proxy) throws Exception {
Field h = proxy.getClass().getSuperclass().getDeclaredField("h");
h.setAccessible(true);
AopProxy aopProxy = (AopProxy) h.get(proxy);
Field advised = aopProxy.getClass().getDeclaredField("advised");
advised.setAccessible(true);
return ((AdvisedSupport)advised.get(aopProxy)).getTargetSource().getTarget();
}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值