spring动态代理返回的接口能否 向下转型为实现类

nihao_医生 2016-11-06 10:57:04

public class UserServiceImpl implements UserService {
@Override
public void addUser() {
System.out.println("tianjiale");
}
public void minit(){
System.out.println("初始化");
}
public void nihao(){
System.out.println("nihao");
}

}


  UserService userService = (UserService) applicationContext.getBean("userServiceId");
System.out.println(userService);
userService.addUser();
((UserServiceImpl)userService).nihao();


控制台信息:
test.life.UserServiceImpl@134b191
tianjiale

java.lang.ClassCastException: com.sun.proxy.$Proxy5 cannot be cast to test.life.UserServiceImpl


为什么我向下转型调用实现类里的方法就报错?
但我这里输出的我的userService是实现类呀。
我知道动态代理是使用接口,那么这个返回的只是UserService接口?那么又为什么输出userService信息是UserServiceImp实现类呢?
我在配置文件里,
<bean id="userServiceId" class="test.life.UserServiceImpl" init-method="minit"></bean>
...全文
265 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
nihao_医生 2016-11-07
  • 打赏
  • 举报
回复
恩。我看看了文章。应该是代理类继承Proxy类。然后实现了Object里面的toString等方法。所以输出是我传入的实现类
nihao_医生 2016-11-07
  • 打赏
  • 举报
回复
引用 1 楼 Q80470101 的回复:
参考: java.lang.ClassCastException: com.sun.proxy.$Proxy27 cannot be cast to com.bbk.n002.service.QuestionService - 残剑_ - 博客园 http://www.cnblogs.com/liuling/p/2014-8-23-001.html
就是动态代理返回的代理类,它和Bean里写的实现类没有关系了? 只是把代理类接口中方法指向我自己实现类中的方法 那么我前面输出这个为什么是实现类?而不是一个新的类?
家里敷泥呀 2016-11-07
  • 打赏
  • 举报
回复
参考: java.lang.ClassCastException: com.sun.proxy.$Proxy27 cannot be cast to com.bbk.n002.service.QuestionService - 残剑_ - 博客园 http://www.cnblogs.com/liuling/p/2014-8-23-001.html
王飞2023 2016-11-07
  • 打赏
  • 举报
回复
	public static <T> T getBean(String s) {
		Object o = null;
		try {
			o = applicationContext.getBean(s);
			if (o instanceof Advised) {
				Advised objAdv = (Advised) o;
				return (T) objAdv.getTargetSource().getTarget();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return (T) o;
	}

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧