关于spring子类实现父类protected方法导致实例化出错的问题

问题描述

关于spring子类实现父类protected方法导致实例化出错的问题

子类实现的抽象方法中引用子类自身的public方法(详细请参看测试Demo),导致报错

父类AbstractBusiness为抽象类
public abstract class AbstractBusiness {
public void execute(){
check();
doBusiness();
}

protected abstract void check();
protected abstract void  doBusiness();

}
子类实现为:
public class TestBusiness extends AbstractBusiness {

/**
 * @override
 */
@Override
protected void check() {
    checkPamater();
}

/**
 * @override
 */
@Override
protected void doBusiness() {
    addUser();
}

public void checkPamater(){
    System.out.println("check:业务校验");
}

private void addUser(){
    System.out.println("dobusiness:业务处理");
}

}

测试类为实例化TestBusiness,并调用execute()方法
@Test
public void testBusiness() {
TestBusiness testBusiness = (TestBusiness)ServiceFinder.findService("testBusiness");
testBusiness.execute();
}

JUnit测试结果为:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'testBusiness' defined in file [E:Workspaceskanhighkanhighv03WebRootWEB-INFclassescomkanhighuser estTestBusiness.class]: Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: org/objectweb/asm/Type
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:314)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1080)
at com.kanhigh.user.common.util.ServiceFinder.findService(ServiceFinder.java:20)
at test.UserServiceImplTest.testBusiness(UserServiceImplTest.java:168)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:82)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:240)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:46)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41)
at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.junit.runners.ParentRunner.run(ParentRunner.java:220)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.NoClassDefFoundError: org/objectweb/asm/Type
at net.sf.cglib.core.TypeUtils.parseType(TypeUtils.java:180)
at net.sf.cglib.core.KeyFactory.<clinit>(KeyFactory.java:66)
at net.sf.cglib.proxy.Enhancer.<clinit>(Enhancer.java:69)
at org.springframework.aop.framework.Cglib2AopProxy.createEnhancer(Cglib2AopProxy.java:228)
at org.springframework.aop.framework.Cglib2AopProxy.getProxy(Cglib2AopProxy.java:170)
at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:112)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.createProxy(AbstractAutoProxyCreator.java:476)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:362)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:322)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:407)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1426)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
... 36 more
Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
... 48 more

解决方案

里面这样调用TestBusiness :

 @Autowired
 private TestBusiness testBusiness;

上面这样,TestBusiness的对象就会注入进来了。

解决方案二:

子类与父类实例变量,静态方法调用

解决方案三:

把TestBusiness 中的checkPamater方法的访问权限修改为protected或private,JUnit测试通过。我想问下,TestBusiness 中的checkPamater方法为public为什么会出现以上错误?!!

解决方案四:

看样子是加载顺序机制的问题,
由于AbstractBusiness 中没有 checkPamater,
而方法的加载顺序是 private, protected, public,
这样在加载 check 方法的时候,checkPamater 还没有被加载;

解决方案五:

Caused by: java.lang.NoClassDefFoundError: org/objectweb/asm/Type

时间: 2024-08-03 10:34:54

关于spring子类实现父类protected方法导致实例化出错的问题的相关文章

PHP中子类重载父类的方法【parent::方法名】_php实例

在PHP中不能定义重名的函数,也包括不能再同一个类中定义重名的方法,所以也就没有方法重载.单在子类中可以定义和父类重名的方法,因为父类的方法已经在子类中存在,这样在子类中就可以把从父类中继承过来的方法重写. 子类中重载父类的方法就是在子类中覆盖从父类中继承过来的方法,父类中的方法被子类继承过来不就可以直接使用吗?为什么还要重载呢?因为有一些情况我们必须要覆盖的.例如,有一个"鸟"类,在这个类中定义了鸟的通用方法"飞翔".将"鸵鸟"类作为它的子类,

Python实现子类调用父类的方法_python

本文实例讲述了Python实现子类调用父类的方法.分享给大家供大家参考.具体实现方法如下: python和其他面向对象语言类似,每个类可以拥有一个或者多个父类,它们从父类那里继承了属性和方法.如果一个方法在子类的实例中被调用,或者一个属性在子类的实例中被访问,但是该方法或属性在子类中并不存在,那么就会自动的去其父类中进行查找. 继承父类后,就能调用父类方法和访问父类属性,而要完成整个集成过程,子类是需要调用的构造函数的. 子类不显式调用父类的构造方法,而父类构造函数初始化了一些属性,就会出现问题

多态-java中为什么会自动执行子类重写父类的方法?

问题描述 java中为什么会自动执行子类重写父类的方法? 问题: 1.在main方法中我没有调用paint方法,为什么它会自动被调用? 2.老师说这是多态,可是多态不是需要三个条件实现么?继承,重写方法,父类引用指向子类对象,这里没有第三点啊 代码如下: public class GameFrame extends Frame{ public void launchFrame(){ setSize(500,500); setLocation(100,100); setVisible(true);

重写-JAVA中子类覆盖了父类的方法,是否还有办法通过子类调用父类同一方法?

问题描述 JAVA中子类覆盖了父类的方法,是否还有办法通过子类调用父类同一方法? JAVA中子类覆盖了父类的方法,是否还有办法通过子类调用父类同一方法? 解决方案 使用super.methodName();调用. Java中super关键字指代的是父类. this关键字指代的是自身. 解决方案二: 用super.方法名调用 解决方案三: 试试super.xxx 解决方案四: 直接用super.方法名调用对应的方法

java-JAVA子类不能继承父类私有方法是么

问题描述 JAVA子类不能继承父类私有方法是么 父类都不能用他本身的私有方法,子类岂不是更不能用了,这一点是怎么证明的?举个例子 解决方案 父类本身的私有方法是可以被自己的其他方法调用的,但是这些私有方法子类是不能调用的,但是可能被间接调用. 例如下面的例子,父类的私有方法被一个公有方法调用了,那么子类继承这个公有方法后也就间接调用了父类的私有方法了.但是子类可直接访问的方法里却没有这个私有方法的. public class Parent { public void say(){ call();

java-关于android子类重写父类方法,方法体里面的方法的问题

问题描述 关于android子类重写父类方法,方法体里面的方法的问题 android中子类重写父类Activity方法,在onCreate这个方法的方法体里面有个setContentView方法,这个方法是调用外部方法吗,为什么前面没加this关键词,不是说方法的方法体里面调用外部方法要加this关键词,加了没加有什么区别 解决方案 不是调用外部方法,这是调用父类Activity中的方法 解决方案二: 子类重写父类的方法应注意的问题java 子类重写父类的方法应注意的问题java 子类重写父类的

spring 依赖注入的困惑 关于子类和父类

问题描述 spring 依赖注入的困惑 关于子类和父类 有一个Son类 package cn.extend; import javax.annotation.Resource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; public class Son extends Father { } 还有一个父类Father

转型-关于如何通过子类调用父类的父类中的方法

问题描述 关于如何通过子类调用父类的父类中的方法 package access; class A{ public A(){System.out.println("A created!");} public int f(){ System.out.println("call A.f()"); return 1; } } class B extends A{ public int f(){ System.out.println("call B.f()"

Python子类调用父类方法学习笔记

python和其他面向对象语言类似,每个类可以拥有一个或者多个父类,它们从父类那里继承了属性和方法.如果一个方法在子类的实例中被调用,或者一个属性在子类的实例中被访问,但是该方法或属性在子类中并不存在,那么就会自动的去其父类中进行查找. 继承父类后,就能调用父类方法和访问父类属性,而要完成整个集成过程,子类是需要调用的构造函数的. 子类不显式调用父类的构造方法,而父类构造函数初始化了一些属性,就会出现问题 如果子类和父类都有构造函数,子类其实是重写了父类的构造函数,如果不显式调用父类构造函数,父