2015-11-02 17 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: объект не является пример объявления класса

У вас есть идеи, где мой код wron г?

Я также попытался это:

@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

Этот булевский вызов = (булевский) метод1.invoke (String.class); –

ответ

7

Вы используете метод isValidEmailAddress с параметром Class<String> (String.class) вместо String. Кроме того, первым аргументом должен быть экземпляр класса, к которому вы хотите вызвать метод (поскольку он не является статическим методом).

Цитирование Method.invoke Javadoc:

Параметры:

  • OBJ - объект основной метод вызывается из
  • арг - аргументы, используемые для вызова метода

Исправленный код:

@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

Смежные вопросы