反射 注解-Java利用反射执行框架注入类的非静态方法

问题描述

Java利用反射执行框架注入类的非静态方法
之前对代码做优化,利用了反射去执行指定类的指定方法:

public static JsonResultVO callMethod(Class<?> className String methodName Class<?>[] paramClass Object[] param) {    JsonResultVO resultVO = new JsonResultVO();    try {        Method m = className.getMethod(methodName paramClass);        resultVO = (JsonResultVO) m.invoke(className.newInstance() param);    } catch (NoSuchMethodException e) {        throw new FrameAppException(""找不到方法:"" + methodName);    } catch (Exception e) {        e.printStackTrace();    }    return resultVO;}

这个是反射方法,把要执行的类 className,方法名methodName,方法参数类型paramClass,以及要传的参数param做了封装。
WEB应用,采用SSH框架。以上方法在 TrustPayCommand 类中,通过反射执行@Service(""wyBaseCommand"")类中的getSpecialAccount(String accName)方法。

public JsonResultVO getSpecialAccount(WyCompanyInDataBean inDataBean) {    // 此方法仅返回商户号与收入户账号    if (SecurityContextHolder.getContext().getAuthentication() == null) {        throw new FrameAppException(""请重新登陆系统!"");    }    OprSessionBean opr = (OprSessionBean) SecurityContextHolder            .getContext().getAuthentication().getDetails();    JsonResultVO resultVO = new JsonResultVO();    String commercialNo = null;    Map paramMap = new HashMap();    paramMap.put(""comCode"" CompanyUtil.getHeadCompany(opr.getBelongComId()));    paramMap.put(""specialType"" Constains.SPECIAL_ACCOUNT_TYPE_WY_PAY);    List<SpecialAccount> list = persister.findListByFields(SpecialAccount.class paramMap);    if(list.size() > 0) {        SpecialAccount s = list.get(0);        resultVO.add2Request(""commercialNo"" s.getCommercialNo());        resultVO.add2Request(""specialAccount"" s.getSpecialAccount());        resultVO.setCode(""0000"");    } else {        resultVO.setMsg(null);        resultVO.setCode(""9999"");    }    return resultVO;}

反射执行时代码:

public static String getCommercialNo() {    JsonResultVO resultVO = new JsonResultVO();    Class<?>[] paramClass = new Class<?>[] {WyCompanyInDataBean.class};    WyCompanyInDataBean[] param = new WyCompanyInDataBean[] {new WyCompanyInDataBean()};    resultVO = callMethod(WyBaseCommand.classgetSpecialAccount"" paramClass param);    if(resultVO.getCode().equals(""0000"")) {        return resultVO.getRequestMap().get(""commercialNo"").toString();    }    return null;}

方法getSpecialAccount()可以进去,执行java.lang.reflect.InvocationTargetException异常,

List<SpecialAccount> list = persister.findListByFields(SpecialAccount.class paramMap);

这一句java.lang.NullPointerException异常。

不知道说清楚了没,这个问题怎么解决?反射不能执行注入类的方法吗?

时间: 2024-08-02 19:23:46

反射 注解-Java利用反射执行框架注入类的非静态方法的相关文章

Java利用反射自动封装成实体对象的方法_java

本文实例讲述了Java利用反射自动封装成实体对象的方法.分享给大家供大家参考.具体分析如下: 利用此方法的时候需要传递的参数的名称,必须以行号结尾,去掉行号就是属性名称,比如页面传递name+rowNo,那么实体对象的属性名应该为name.代码如下 复制代码 代码如下: //获取页面数据,自动封装成bean对象 public List getObjectList(Class clazz,String[] rowNos) throws Exception{         List objList

PHPcms利用xss执行sql注入

昨天看见phpcms v9.1.15爆的xss和无权限的sql注入,于是就想测试下利用xss执行sql注入,虽然爆的这个phpcms漏洞还有很多其他的用法!但是,这个注入我没有找到phpcms v9.1.15测试,其他版本都没有测试成功! 于是乎我只有假想下一个极端环境: 1.前台有且只有一个xss漏洞(不能获取管理员cookie) 2.后台有且只有一个sql注入漏洞(注入漏洞文件只有管理员可以访问) 3.注入获得管理员密码可解密 4.除以上无其他任何漏洞(包括后台getwebshell) 其实

Java反射高级应用--利用反射调用类的私有方法修改私有方法值,以及替换Java的类成员数据

  package me.test; import java.lang.reflect.*;  //导入反射需要的包 public class ReflectTest {  public static void main(String[] args)  throws  Exception  {       /*  下面通过反射完成对一个对象中成员的替换    *   并且执行执行私有方法     *   完成对 Poiont类的对象中所有的 String的对象的d换成x    *   并且类中无

java利用反射实现动态代理示例_java

复制代码 代码如下: package com.et59.cus.domain.dao.ex; import java.lang.reflect.Field;import java.lang.reflect.Method;import java.lang.reflect.Modifier; import org.apache.log4j.Logger;/** *  * <p>Title: ReflectUtil.java</p> * <p>Description: 反射&

Java利用反射来获取一个方法的 范型化参数 Vector&amp;lt;Integer&amp;gt;的类型

假设有如下类 class   A {      public  void   show(Vector<Integer> v)  {} }   在我们不知道Vector中数据的类型的时候 这时候我们只知道这个方法的名字  和参数的个数 ,我们来获取 范型化的实际类型 .  我们不可能通过 Vector对应的Class类来反射出  泛型集合中的类型  ,但是 我们却可以通过 这个方法所对应的Method类来实现 . 具体如下  : import java.lang.reflect.Method;

java反射拼接方法名动态执行方法实例_java

近期由于负责项目的一个模块,该模块下有很多分类,每个分类都有一个编码code,这个值是作为一个参数携带过来的.但是每个code确实对应一个方法的. code的值有很多个,自己又不想做ifelse或者switch判断于是就狂搜资料,主要让我发现利用java的反射机制可以完美的解决这个问题 测试代码如下:(可以携带多个参数哦) package com.escs.xmlutils; import java.lang.reflect.Method; public class Test { public

数组类型转换-JAVA如何利用反射指定類型

问题描述 JAVA如何利用反射指定類型 自己写一个工具类,求大神帮忙看下能否利用反射或者泛型实现类型转换. public static Object[] getArray(Class cString str){ List list=jdbcUtil.getList(c str);//list是利用反射生成的List return list.toArray(new Object[list.size()]);//可否根据传入的Class指定Array类型 } 因為:Object[] objs=new

java 利用java反射机制动态加载类的简单实现_java

如下所示: ////////////////// Load.java package org.bromon.reflect; import java.util.ArrayList; import java.util.List; public class Load implements Operator { @Override public List<?> act(List<?> params) { // TODO Auto-generated method stub List<

java中利用反射调用另一类的private方法的简单实例_java

我们知道,Java应用程序不能访问持久化类的private方法,但Hibernate没有这个限制,它能够访问各种级别的方法,如private, default, protected, public. Hibernate是如何实现该功能的呢?答案是利用JAVA的反射机制,如下:  import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class ReflectDemo