美文网首页
java反射invoke动态调用方法

java反射invoke动态调用方法

作者: 温暖的纯真 | 来源:发表于2019-04-28 11:17 被阅读0次
@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被彻底卸载之前。

相关文章

  • Java动态代理

    java动态代理 先看Method反射,调用getDeclaredMethod查找方法;invoke执行方法,返回...

  • java反射invoke动态调用方法

    @Autowired标签自动注入TestMapper失败,可能出现的空指针报错: java.lang.NullPo...

  • 【Java 进阶】Java 反射

    反射:获取Class中所有字段(Field)与方法(Method),并实现调用(invoke) Java 反射简单...

  • JVM的反射调用实现

    如何执行反射调用 Java的反射调用是通过java.lang.reflect.Method的invoke调用执行,...

  • Java反射,动态代理,设计模式,JVM内存划分

    反射,终极手段,规则的破坏者。 静态与动态 实例 执行所加载类的方法 invoke执行方法例子 invoke调用私...

  • 9012年了,别说java反射慢了

    java 反射 java反射 调用 通过Method.invoke 委托给sun.reflect.MethodAc...

  • 反射+动态代理

    反射+动态代理反射:以类名得到该类的属性名,属性值,方法名,方法的默认返回值,然后调用set/invoke等方法来...

  • Java高级知识

    反射 sczyh30 深入解析Java反射(1) - 基础深入解析Java反射(2) - invoke方法深入探究...

  • Java7新特性9-方法句柄

    方法句柄-现代化的反射 java7中为间接调用方法引入了新的api,其中最关键的是java.lang.invoke...

  • Java反射与动态代理

    Java反射 Java反射机制可以动态地获取类的结构,动态地调用对象的方法,是java语言一个动态化的机制 特点:...

网友评论

      本文标题:java反射invoke动态调用方法

      本文链接:https://www.haomeiwen.com/subject/zuzrnqtx.html