精华内容
下载资源
问答
  • 捕获java反射执行方法抛出的异常

    万次阅读 2017-12-07 09:47:04
    一般在业务开发时需要向上层抛异常写法如下:public void A() throws Exception{ throw new Exception(); } public void B(){ ...}但是如果是通过反射调用的A方法那么如果直接catch异常类Exception 会返回nu

    一般在业务开发时需要向上层抛异常写法如下:

    public void A() throws Exception{
      throw new Exception();
    }
    public void B(){
      try{
        A();
      }catch(Exception e){
        //具体处理异常
      }
    }

    但是如果是通过反射调用的A方法那么如果直接catch异常类Exception
    会返回null,所以应该用如下方法捕获:

    public String handleException() {
            String msg = null;
            try {
                Object o = Class.forName("xxx.xxx").newInstance();
                o.getClass().getMethod("").invoke(o);
            } catch (Exception e) {
                if (e instanceof InvocationTargetException) {
                    Throwable targetEx =((InvocationTargetException)e).getTargetException();
                    if (targetEx != null) {
                        msg = targetEx.getMessage();
                    }
                } else {
                    msg = e.getMessage();
                }
            }
            return msg;
        }
    展开全文
  • 异常如下 Exception in thread "main" java.lang.NoSuchMethodException: com.dyq.homework.Student.setName() at java.lang.Class.getMethod(Class.java:1786) at com.dyq.homework.TestHomeWork.main...

    异常如下

    Exception in thread "main" java.lang.NoSuchMethodException: com.dyq.homework.Student.setName()
    	at java.lang.Class.getMethod(Class.java:1786)
    	at com.dyq.homework.TestHomeWork.main(TestHomeWork.java:69)
    

    Student类(写了主要部分)

        public void setName(String name) {
            this.name = name;
        }
        public void setAge(Integer age) {
            this.age = age;
        }
        public void setSex(String sex) {
            this.sex = sex;
        }
    

    程序代码:(只写了主要出错的部分)

    	Class clazz = Class.forName(clazzName);//clazzName为该类的地址
    	//无参构造
        Object stu2 = clazz.newInstance();
        Method setName = clazz.getMethod("setName");//出错地方,没有写形参类型
        //应改为Method setName = clazz.getMethod("setName",String.class);
        setName.invoke(stu2, stuName);
        Method setAge = clazz.getMethod("setAge");//出错地方,没有写形参类型
        //应改为Method setAge = clazz.getMethod("setAge",Integer.class);
        setAge.invoke(stu2,Integer.parseInt(stuAge));
        Method setSex = clazz.getMethod("setSex");//出错地方,没有写形参类型
        //应改为 Method setSex = clazz.getMethod("setSex",String.class);
        setSex.invoke(stu2,stuSex);
    

    错误分析

    	Class.getMethod(String str, Class<?>... parameterTypes):
    	该方法的第一个参数是要获得方法的名字,第二个参数是按声明顺序标识该方法形参类型
    	由于我没有写后面的形参类型导致找不到方法,所以出错
    
    展开全文
  • 以上方法在 TrustPayCommand 类中,通过反射执行@Service("wyBaseCommand")类中的getSpecialAccount(String accName)方法。 public JsonResultVO getSpecialAccount(WyCompanyInDataBean inDataBean) { // 此...
  • 最近做项目用到定时任务...在执行invoke方法的时候,一直报空指针异常,百度了一下午才找到解决方案。现在把解决方法分享给大家。先看下代码:首先是一个测试类:@Testpublic void test() {String classBeanName = "...

    最近做项目用到定时任务,在设计的时候,考虑到每条job对应一个jobClass和jobMethod,会需要用到反射技术。

    通过反射技术获取指定的方法,然后去执行。但是!!!在执行invoke方法的时候,一直报空指针异常,百度了一下午才找到解决方案。现在把解决方法分享给大家。

    先看下代码:

    首先是一个测试类:

    @Test

    public void test() {

    String classBeanName = "com.bandweaver.tunnel.service.mam.measobj.MeasObjModuleCenter";

    String targetMethod = "saveSOSchedule";

    try {

    Class> clazz = Class.forName(classBeanName);

    Method method = clazz.getDeclaredMethod(targetMethod);

    LogUtil.info("Get method : " + method);

    method.setAccessible(true);

    method.invoke(clazz.newInstance());

    } catch (Exception e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    我的目的是要执行下面这个方法,代码不需要细看,你只需要知道我这个方法里需要用到@autowired注解去获取我需要的bean,这就是为什么报空指针的原因了。

    /**SO

    *

    * @author shaosen

    * @throws Exception

    * @Date 2018年9月10日

    */

    public void saveSOSchedule(){

    //从缓存中获取数据,然后定时向对象表中更新数据,并同时保存到value表中

    ListmeasObjSOs = getMeasObjSOs();

    LogUtil.info("*******************************************************************");

    LogUtil.info("*******************************************************************");

    LogUtil.info("*******************************************************************");

    LogUtil.info("measObjSOs.size: " + measObjSOs.size() );

    for (MeasObjSO measObjSO : measObjSOs) {

    //step1:保存数据到value表中

    if(measValueSOMapper == null ) { measValueSOMapper = SpringContextHolder.getBean("measValueSOMapper");}

    Listlist = measValueSOMapper.getByObjectId(measObjSO.getId());

    LogUtil.info("Get list : " + list);

    if(list != null && list.size() >0 ) {

    MeasValueSO measValueSO = list.get(0);

    if(measValueSO.getTime() != null && measValueSO.getTime().getTime()>=measObjSO.getRefreshTime().getTime()) {

    LogUtil.info("SO监测对象[" + measObjSO.getId() + "]缓存数据暂无更新 ");

    continue;

    }

    }

    MeasValueSO measValueSO = new MeasValueSO();

    measValueSO.setObjectId(measObjSO.getId());

    measValueSO.setTime(measObjSO.getRefreshTime());

    measValueSO.setCV(measObjSO.getCV());

    LogUtil.info("Start to save : " + measValueSO);

    measValueSOMapper.addMeasValueSO(measValueSO);

    LogUtil.info("Success !");

    //step2:更新对象表

    if(measObjSOMapper == null ) { measObjSOMapper = SpringContextHolder.getBean("measObjSOMapper");}

    MeasObjSO fromDb = measObjSOMapper.getMeasObjSO(measObjSO.getId());

    if(fromDb.getRefreshTime() != null && fromDb.getRefreshTime().getTime() >= measObjSO.getRefreshTime().getTime()) {

    LogUtil.info("SO监测对象[" + measObjSO.getId() + "]缓存数据暂无更新 ");

    continue;

    }

    fromDb.setRefreshTime(measObjSO.getRefreshTime());

    fromDb.setCV(measObjSO.getCV());

    LogUtil.info("Start to update : " + fromDb);

    measObjSOMapper.update(fromDb);

    LogUtil.info("Success !");

    }

    }

    原因:method.invoke(clazz.newInstance());事实上class.newInstance()生成的实例中,是获取不到@autowired组件的

    解决方案:method.invoke(ApplicationContextUtils.getBean("measObjModuleCenter"))

    把代码修改成如下:

    @Test

    public void test() {

    String classBeanName = "com.bandweaver.tunnel.service.mam.measobj.MeasObjModuleCenter";

    String targetMethod = "saveSOSchedule";

    try {

    Class> clazz = Class.forName(classBeanName);

    Method method = clazz.getDeclaredMethod(targetMethod);

    LogUtil.info("Get method : " + method);

    method.setAccessible(true);

    method.invoke(SpringContextHolder.getBean("measObjModuleCenter"));

    } catch (Exception e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    }

    顺手把SpringContextHolder工具类也粘贴了吧

    package com.bandweaver.tunnel.common.platform.util;

    import org.springframework.context.ApplicationContext;

    import org.springframework.context.ApplicationContextAware;

    import com.bandweaver.tunnel.common.platform.log.LogUtil;

    public class SpringContextHolder implements ApplicationContextAware {

    private static ApplicationContext applicationContext = null;

    /**

    * 取得存储在静态变量中的ApplicationContext.

    */

    public static ApplicationContext getApplicationContext() {

    assertContextInjected();

    return applicationContext;

    }

    /**

    * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.

    */

    @SuppressWarnings("unchecked")

    public static T getBean(String name) {

    LogUtil.debug("从SpringContextHolder中取出Bean:" + name);

    assertContextInjected();

    return (T) applicationContext.getBean(name);

    }

    /**

    * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.

    */

    public static T getBean(ClassrequiredType) {

    assertContextInjected();

    return applicationContext.getBean(requiredType);

    }

    /**

    * 清除SpringContextHolder中的ApplicationContext为Null.

    */

    public static void clearHolder() {

    LogUtil.debug("清除SpringContextHolder中的ApplicationContext:"

    + applicationContext);

    applicationContext = null;

    }

    /**

    * 实现ApplicationContextAware接口, 注入Context到静态变量中.

    */

    @Override

    public void setApplicationContext(ApplicationContext applicationContext) {

    //LogUtil.debug("注入ApplicationContext到SpringContextHolder:{}", applicationContext);

    if (SpringContextHolder.applicationContext != null) {

    LogUtil.info("SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:" + SpringContextHolder.applicationContext);

    }

    SpringContextHolder.applicationContext = applicationContext; // NOSONAR

    }

    /**

    * 实现DisposableBean接口, 在Context关闭时清理静态变量.

    */

    public void destroy() throws Exception {

    SpringContextHolder.clearHolder();

    }

    /**

    * 检查ApplicationContext不为空.

    */

    private static void assertContextInjected() {

    if(applicationContext == null) {

    throw new IllegalStateException("applicaitonContext属性未注入, 请在applicationContext.xml中定义SpringContextHolder.");

    }

    }

    }

    展开全文
  • java反射invoke调用方法报空指针异常

    千次阅读 2018-09-10 20:16:55
    最近做项目用到定时任务,在...在执行invoke方法的时候,一直报空指针异常,百度了一下午才找到解决方案。现在把解决方法分享给大家。   先看下代码: 首先是一个测试类: @Test public void test() { Str...

    最近做项目用到定时任务,在设计的时候,考虑到每条job对应一个jobClass和jobMethod,会需要用到反射技术。

    通过反射技术获取指定的方法,然后去执行。但是!!!在执行invoke方法的时候,一直报空指针异常,百度了一下午才找到解决方案。现在把解决方法分享给大家。

     

    先看下代码:

    首先是一个测试类:

        @Test
    	public void test() {
    		String classBeanName = "com.bandweaver.tunnel.service.mam.measobj.MeasObjModuleCenter";
    		String targetMethod = "saveSOSchedule";
    		try {
    			Class<?> clazz = Class.forName(classBeanName);
    			Method method = clazz.getDeclaredMethod(targetMethod);
    			LogUtil.info("Get method : " + method);
    			method.setAccessible(true);
                method.invoke(clazz.newInstance());
    			
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}

    我的目的是要执行下面这个方法,代码不需要细看,你只需要知道我这个方法里需要用到@autowired注解去获取我需要的bean,这就是为什么报空指针的原因了。

    /**SO 
         *    
         * @author shaosen
         * @throws Exception 
         * @Date 2018年9月10日
         */
        public void saveSOSchedule(){
       	   //从缓存中获取数据,然后定时向对象表中更新数据,并同时保存到value表中
           List<MeasObjSO> measObjSOs = getMeasObjSOs();
           LogUtil.info("*******************************************************************");
           LogUtil.info("*******************************************************************");
           LogUtil.info("*******************************************************************");
           LogUtil.info("measObjSOs.size: " + measObjSOs.size() );
           for (MeasObjSO measObjSO : measObjSOs) {
           	
           	//step1:保存数据到value表中
        	if(measValueSOMapper == null ) { measValueSOMapper = SpringContextHolder.getBean("measValueSOMapper");}
           	List<MeasValueSO> list = measValueSOMapper.getByObjectId(measObjSO.getId());
           	LogUtil.info("Get list : " + list);
           	if(list != null && list.size() >0 ) {
           		MeasValueSO measValueSO = list.get(0);
           		if(measValueSO.getTime() != null && measValueSO.getTime().getTime()>=measObjSO.getRefreshTime().getTime()) {
           			LogUtil.info("SO监测对象[" + measObjSO.getId() + "]缓存数据暂无更新 ");
               		continue;
           		}
           	}
           	MeasValueSO measValueSO = new MeasValueSO();
           	measValueSO.setObjectId(measObjSO.getId());
           	measValueSO.setTime(measObjSO.getRefreshTime());
           	measValueSO.setCV(measObjSO.getCV());
           	LogUtil.info("Start to save : " + measValueSO);
           	measValueSOMapper.addMeasValueSO(measValueSO);
           	LogUtil.info("Success !");
           	
           	//step2:更新对象表
           	if(measObjSOMapper == null ) { measObjSOMapper = SpringContextHolder.getBean("measObjSOMapper");}
           	MeasObjSO fromDb = measObjSOMapper.getMeasObjSO(measObjSO.getId());
           	if(fromDb.getRefreshTime() != null && fromDb.getRefreshTime().getTime() >= measObjSO.getRefreshTime().getTime()) {
           		LogUtil.info("SO监测对象[" + measObjSO.getId() + "]缓存数据暂无更新 ");
           		continue;
           	}
           	fromDb.setRefreshTime(measObjSO.getRefreshTime());
           	fromDb.setCV(measObjSO.getCV());
           	LogUtil.info("Start to update : " + fromDb);
           	measObjSOMapper.update(fromDb);
           	LogUtil.info("Success !");
       	}
       }

    原因:method.invoke(clazz.newInstance());事实上class.newInstance()生成的实例中,是获取不到@autowired组件的

    解决方案:method.invoke(ApplicationContextUtils.getBean("measObjModuleCenter"))

    把代码修改成如下:

    @Test
    	public void test() {
    		String classBeanName = "com.bandweaver.tunnel.service.mam.measobj.MeasObjModuleCenter";
    		String targetMethod = "saveSOSchedule";
    		try {
    			Class<?> clazz = Class.forName(classBeanName);
    			Method method = clazz.getDeclaredMethod(targetMethod);
    			LogUtil.info("Get method : " + method);
    			method.setAccessible(true);
    			method.invoke(SpringContextHolder.getBean("measObjModuleCenter"));
    			
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    	}

    顺手把SpringContextHolder工具类也粘贴了吧

    package com.bandweaver.tunnel.common.platform.util;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
    
    import com.bandweaver.tunnel.common.platform.log.LogUtil;
    
    public class SpringContextHolder implements ApplicationContextAware {
    
    	private static ApplicationContext applicationContext = null;
    
    
    	/**
    	 * 取得存储在静态变量中的ApplicationContext.
    	 */
    	public static ApplicationContext getApplicationContext() {
    		assertContextInjected();
    		return applicationContext;
    	}
    
    	/**
    	 * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.
    	 */
    	@SuppressWarnings("unchecked")
    	public static <T> T getBean(String name) {
    		LogUtil.debug("从SpringContextHolder中取出Bean:" + name);
    		assertContextInjected();
    		return (T) applicationContext.getBean(name);
    	}
    
    	/**
    	 * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.
    	 */
    	public static <T> T getBean(Class<T> requiredType) {
    		assertContextInjected();
    		return applicationContext.getBean(requiredType);
    	}
    
    	/**
    	 * 清除SpringContextHolder中的ApplicationContext为Null.
    	 */
    	public static void clearHolder() {
    		LogUtil.debug("清除SpringContextHolder中的ApplicationContext:"
    				+ applicationContext);
    		applicationContext = null;
    	}
    
    	/**
    	 * 实现ApplicationContextAware接口, 注入Context到静态变量中.
    	 */
    	@Override
    	public void setApplicationContext(ApplicationContext applicationContext) {
    //		LogUtil.debug("注入ApplicationContext到SpringContextHolder:{}", applicationContext);
    
    		if (SpringContextHolder.applicationContext != null) {
    			LogUtil.info("SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:" + SpringContextHolder.applicationContext);
    		}
    
    		SpringContextHolder.applicationContext = applicationContext; // NOSONAR
    	}
    
    	/**
    	 * 实现DisposableBean接口, 在Context关闭时清理静态变量.
    	 */
    	public void destroy() throws Exception {
    		SpringContextHolder.clearHolder();
    	}
    
    	/**
    	 * 检查ApplicationContext不为空.
    	 */
    	private static void assertContextInjected() {
    		if(applicationContext == null) {
    			throw new IllegalStateException("applicaitonContext属性未注入, 请在applicationContext.xml中定义SpringContextHolder.");
    		}
    	}
    }

     

    展开全文
  • 背景:对于kohana早期框架对类里面的before after以及controller和action的函数均可以用反射类来灵活按既定顺序执行,而在执行的时候假如异常,可以通过PHP提供的异常捕获进行捕获输出,这就涉及到类变对象后其参数的...
  • 反射&异常

    2018-12-21 19:39:00
    python中的反射功能是由以下四个内置函数提供:hasattr、getattr、setattr、delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员、获取成员、设置成员、删除成员。 hasattr(obj,name_str) , 判断一个...
  • JavaWeb 反射 NoSuchMethodException异常解决方案 问题描述: 在编写JavaWeb程序时,报错情况如下:找不到要执行的类 我使用的工具: IDEA 报错情景: JavaWeb 写Servlet使用反射调用方法时,报错位置如下: ...
  • java反射异常

    千次阅读 2017-10-19 18:08:39
    java.lang.RuntimeException: 方法执行失败 at cn.zhang.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:42) at cn.zhang.Test1.test03(Test1.java:39) at sun.reflect.NativeMethodAccessorImpl.invoke0...
  • 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序   面向对象高级语法部分 经典类vs新式类 把下面代码用python2 和python3都执行一下 1 #_*_coding:utf-8_*_ 2 ...
  • 能够分析类能力的程序称为反射。对于给定的Java类名,可以...虚拟机利用运行时类型信息选择相应的方法执行。可以通过专门的Java类访问这些信息。保存这些信息的类被称为Class。创建Class类对象的三种方法:1. 通过...
  • Java异常反射详解

    2020-09-09 21:48:16
    就可以通过另一种路径退出方法,在这种情况下会抛出一个封装了错误信息的对象,此时这个方法会立即退出同时不返回任何值,另外,调用这个方法的其他代码也无法执行异常处理机制会将代码执行交给异常处理器 ...
  • 反射是一种编程方法体现,凝聚了高内聚、松耦合的编程思想, 不能简单的用执行字符串exec和eval来代替。 ''' 4个相关的内置函数 hasattr(obj,str):检查模块或者对象中是否有某个成员 getattr(obj,str):获取...
  • 文章目录异常处理反射Class类Class类实例方法访问字段Field对象方法调用方法Method对象方法多态调用构造方法获取继承关系动态代理 异常处理 throws在方法体前声明此方法可能抛出的异常 throw在方法体内执行抛出...
  • Python 异常处理软件异常(Exception),是指当程序出现错误后程序的处理方法,异常机制提供了程序正常退出的安全通道.当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器,如序列的下标越界、打开不存在...
  • Object-C的异常处理  Object-C的异常处理,通常不会作为常规的编程手段,很多时候只是作为程序调试的... // 执行代码  }  @catch(异常类1 形参名1) ----@catch块可以有很0~N个  {  // 异常处理块  }  
  • 本文转载http://blog.sina.com.cn/s/blog_6151984a0100kwy0.html反射机制出现的InstantiationException异常反射机制时,执行如下的语句:Class class1 = Class.forName(className);Object o1 = class1.newInstance()...
  • 一.JAVA 异常分类及处理1....另外,调用这个方法的其他代码也无法继续执行异常处理机制会将代码执行交给异常处理器。2. 异常分类Throwable 是 Java 语言中所有错误或异常的超类。下一层分为 Error 和 Exception...
  • 需要注意的是getDeclaredMethods)并不能获取父类的方法可以使用getMethods)方法来代替但是该方法是只能获取所有的public类型的方法 获取类的方法之后可以根据方法名称来执行方法 图9-11 运行结果 本案例中调用了两个...
  • 在eclipse里,在A类里用反射机制加载B类,并实例化。执行一次A类中的main方法后,修改B类的成员变量。再次执行A类的main方法(A类并没有语法错误),则会报实例化异常。这是怎么回事?
  • 在使用反射执行一个方法时常遇到object is not an instance of declaring class的异常,如下代码:view plaincopy to clipboardprint? Java代码 import java.lang.reflect.Method; import java.text....
  • 在使用反射执行一个方法时常遇到object is not an instance of declaring class的异常,如下代码:import java.lang.reflect.Method; import java.text.SimpleDateFormat; import java.util.Date; import ...
  • 一.JAVA 异常分类及处理 ...另外,调用这个方法的其他代码也无法继续执行异常处理机制会将代码执行交给异常处理器。 2. 异常分类 Throwable 是 Java 语言中所有错误或异常的超类。下一层分为 Erro...
  • JAVA 异常分类及处理...另外,调用这个方法的其他代码也无法继续执行异常处理机制会将代码执行交给异常处理器。异常分类Throwable 是 Java 语言中所有错误或异常的超类。下一层分为 Error 和 ExceptionError1. ...
  • JAVA 异常分类及处理 ...这个方法的其他代码也无法继续执行异常处理机制会将代码执行交给异常处理器。 异常分类 Throwable 是 Java 语言中所有错误或异常的超类。下一层分为 Error 和 Exception Err...
  • package reflect; import java.io.InputStream; import java.lang.reflect....* 框架类,可以创建任意类,执行类的方法 * */ public class ReflectDemo02 { public static void main(String[] args) throws.
  • Method 介绍继承的方法(包括重载、重写和隐藏的)会被编译器强制执行,这些方法都无法反射。因此,反射一个类的方法时不考虑父类的方法,只考虑当前类的方法。每个方法都由 修饰符、返回值、参数、注解和抛出的异常...

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 266
精华内容 106
关键字:

反射执行方法异常