@Service
@Transactional(rollbackFor = Exception.class)
public class testService {
@Autowired
TestMapper testMapper;
/**第一步*/
private static TestService testService;
/**第二步*/
@PostConstruct
public void init(){
testService = this;
testService.testMapper = this.testMapper;
}
public List<Test> getList(Integer page, Integer size, String keywords) {
int start = (page - 1) * size;
Date endDate = null;
Date startDate = null;
String methodName = "testMethod";
list = (List<Test>) testService.invoke("org.basic.service.testService",
methodName , start, size, keywords);
return list;
}
/**
* 反射调用动态方法
*/
public List<Test> testMethod(Integer start, Integer size, String keywords){
List list = null;
try {
/**第三步*/
list = testService.testMapper.getListByPage(start, size, keywords);
}catch (NullPointerException e){
e.printStackTrace();
}
return list;
}
/**
* 方法反射
* @param className
* @param methodName
* @param params
* @return
*/
public static Object invoke(String className, String methodName, Object...params){
try {
Class<?> c = Class.forName(className);
Object obj = c.newInstance();
Method[] methods = c.getDeclaredMethods();
Method callMethod = null;
for(Method method:methods){
if(method.getName().equals(methodName)){
callMethod = method;
break;
}
}
callMethod.setAccessible(true);
return callMethod.invoke(obj, params);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Autowired标签自动注入TestMapper失败,可能出现的空指针报错:
java.lang.NullPointerException
解决:注意代码中标明的第一步,第二步,第三步
从Java EE5规范开始,Servlet增加了两个影响Servlet生命周期的注解(Annotation):@PostConstruct和@PreConstruct。这两个注解被用来修饰一个非静态的void()方法.而且这个方法不能有抛出异常声明。
被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Serclet的inti()方法。被@PostConstruct修饰的方法会在构造函数之后,init()方法之前运行。
被@PreDestroy修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。被@PreDestroy修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前。
网友评论