2015-11-02 87 views
2
public class SendEmailImpl 
{  
    private boolean isValidEmailAddress(String email) 
    { 
     boolean stricterFilter = true; 
     String stricterFilterString = "[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"; 
     String laxString = "[email protected]+\\.[A-Za-z]{2}[A-Za-z]*"; 
     String emailRegex = stricterFilter ? stricterFilterString : laxString; 
     Pattern p = Pattern.compile(emailRegex); 
     Matcher m = p.matcher(email); 
     return m.matches(); 
    } 
} 

的一个实例,我试图用反射Java对象不是声明类

@Test 
public void testValidEmail() throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException 
{ 
    Method method = SendEmailImpl.class.getDeclaredMethod("isValidEmailAddress", String.class); 
    method.setAccessible(true); 
    Boolean invoke = (Boolean) method.invoke("isValidEmailAddress", String.class); 

    assertTrue(invoke); 
    System.out.println("Testing E-mail validator - case [email protected]"); 
} 

调用这个代码,但我得到错误

java.lang.IllegalArgumentException异常:对象不是申报类的实例

你知道我的代码在哪里吗G?

我也试过这样:

@Test 
public void testValidEmail() throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException 
{ 
    Method method1 = SendEmailImpl.class.getDeclaredMethod("isValidEmailAddress", String.class); 
    method1.setAccessible(true); 

    Boolean invoke = (Boolean)method1.invoke(String.class); 
    assertTrue(invoke); 
    System.out.println("Testing E-mail validator - case [email protected]"); 
} 

但结果是一样的。

+0

什么生产线抛出异常? – JohnnyAW

+0

这一个布尔invoke =(布尔)method1.invoke(String.class); –

回答

7

您使用Class<String>参数(String.class)而不是String调用isValidEmailAddress方法。另外,第一个参数应该是你想调用该方法的类的一个实例(因为它不是一个静态方法)。

引用Method.invoke的Javadoc:

参数

  • OBJ - 底层方法从
  • ARGS调用的对象 - 用于该方法调用
参数

更正后的代码:

@Test 
public void testValidEmail() throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { 
    SendEmailImpl instance = new SendEmailImpl(); 
    Method method = instance.getClass().getDeclaredMethod("isValidEmailAddress", String.class); 
    method.setAccessible(true); 
    Boolean invoke = (Boolean) method.invoke(instance, "myStringArgument"); 
    // rest of code 
} 
+0

我如何用已经运行的类来做到这一点?而不创建新的实例。 – m4heshd