Skip to content

Latest commit

History

History
97 lines (71 loc) 路 6.5 KB

File metadata and controls

97 lines (71 loc) 路 6.5 KB

Reflection

孝械屑邪 褉械褎谢械泻褋懈懈 屑芯卸械褌 锌芯泻邪蟹邪褌褜褋褟 褋谢芯卸薪芯泄, 薪芯 芯斜褖械械 锌褉械写褋褌邪胁谢械薪懈械 芯 薪械泄 懈屑械褌褜 薪褍卸薪芯, 褌.泻. 薪邪 褝褌芯屑 褋褌褉芯懈褌褋褟 斜芯谢褜褕邪褟 褔邪褋褌褜 褎褉械泄屑胁芯褉泻芯胁 (胁泻谢褞褔邪褟 JUnit).

袪械褎谢械泻褋懈褟 - API, 锌芯蟹胁芯谢褟褞褖懈褏 邪薪邪谢懈蟹懈褉芯胁邪褌褜 锌褉懈谢芯卸械薪懈械 胁 屑芯屑械薪褌 懈褋锌芯谢薪械薪懈褟.

袪械褎谢械泻褋懈褟 薪邪褔懈薪邪械褌褋褟 褋 褌芯谐芯, 褔褌芯 褍 薪邪褋 械褋褌褜 泻谢邪褋褋, 泻芯褌芯褉褘泄 薪邪蟹褘胁邪械褌褋褟 Class.

袨斜褗械泻褌褘 褝褌芯谐芯 泻谢邪褋褋邪 芯锌懈褋褘胁邪褞褌 泻谢邪褋褋褘, 蟹邪谐褉褍卸械薪薪褘械 胁 锌邪屑褟褌褜 JVM.

袧邪锌褉懈屑械褉, 褍 胁邪褋 械褋褌褜 泻谢邪褋褋 Product. 袣芯谐写邪 JVM 蟹邪谐褉褍卸邪械褌 褝褌芯褌 泻谢邪褋褋 懈蟹 斜邪泄褌-泻芯写邪, 褌芯 芯薪邪 褋芯蟹写邪褢褌 芯斜褗械泻褌 泻谢邪褋褋邪 Class, 泻芯褌芯褉褘泄 懈 芯锌懈褋褘胁邪械褌 泻谢邪褋褋 Product.

效褌芯 蟹薪邪褔懈褌 芯锌懈褋褘胁邪械褌? 协褌芯 蟹薪邪褔懈褌 褋屑芯褌褉懈褌 薪邪 薪械谐芯 锌褉懈屑械褉薪芯 泻邪泻 屑褘 褋 胁邪屑懈:

  1. 袧邪蟹胁邪薪懈械
  2. 袧邪斜芯褉 锌芯谢械泄
  3. 袧邪斜芯褉 屑械褌芯写芯胁
  4. 懈 褌.写.

袣邪卸写褘泄 芯斜褗械泻褌 蟹薪邪械褌, 泻 泻邪泻芯屑褍 泻谢邪褋褋褍 芯薪 锌褉懈薪邪写谢械卸懈褌. 袣芯谐写邪 IDEA 谐械薪械褉懈褉褍械褌 equals 胁芯褌 褝褌邪 褋褌褉芯泻邪 懈 锌褉芯胁械褉褟械褌, 褔褌芯 芯斜褗械泻褌 芯褌薪芯褋褟褌褋褟 泻 芯写薪芯屑褍 懈 褌芯屑褍 卸械 泻谢邪褋褋褍: if (o == null || getClass() != o.getClass()) return false;.

袟邪褔械屑 褝褌芯 薪褍卸薪芯? 袪械褎谢械泻褋懈褟 锌芯蟹胁芯谢褟械褌 薪邪屑 斜褍泻胁邪谢褜薪芯 胁 褑懈泻谢械 锌械褉械斜懈褉邪褌褜 锌芯谢褟 懈 屑械褌芯写褘, 胁褘锌芯谢薪褟褟 薪械芯斜褏芯写懈屑褘械 写械泄褋褌胁懈褟:

  • JUnit 褋屑芯褌褉懈褌, 薪邪锌懈褋邪薪芯 谢懈 薪邪写 屑械褌芯写芯屑 @Test
  • Mockito 褋屑芯褌褉懈褌, 薪邪锌懈褋邪薪芯 谢懈 薪邪写 锌芯谢械屑 @Mock, @InjectMocks
  • 懈 褌.写.

袠 褋邪屑芯械 谐谢邪胁薪芯械 - 斜谢邪谐芯写邪褉褟 褉械褎谢械泻褋懈懈 JUnit, Mockito 懈 写褉褍谐懈械 懈薪褋褌褉褍屑械薪褌褘 屑芯谐褍褌 褋芯蟹写邪胁邪褌褜 芯斜褗械泻褌褘 锌褉褟屑芯 胁芯 胁褉械屑褟 懈褋锌芯谢薪械薪懈褟 锌褉芯谐褉邪屑屑褘.

袩邪褉芯写懈褟 薪邪 JUnit

协褌芯 褔邪褋褌褜 "锌褉芯写胁懈薪褍褌邪褟", 薪懈褔械谐芯 褋褌褉邪褕薪芯谐芯, 械褋谢懈 胁褘 械褢 芯锌褍褋褌懈褌械 懈谢懈 芯褋褌邪胁懈褌械 写芯 谢褍褔褕懈褏 胁褉械屑褢薪. 袨薪邪 薪械 褟胁谢褟械褌褋褟 泻褉懈褌懈褔薪芯泄 懈 薪械芯斜褏芯写懈屑芯泄 写谢褟 锌芯薪懈屑邪薪懈褟 芯褋褌邪谢褜薪芯泄 褔邪褋褌懈 泻褍褉褋邪 懈 薪邪锌懈褋邪薪邪 褌芯谢褜泻芯 写谢褟 褌芯谐芯, 褔褌芯斜褘 懈薪褌械褉械褋褍褞褖懈械褋褟 屑芯谐谢懈 锌芯谢褍褔懈褌褜 斜邪蟹芯胁褍褞 懈薪褎芯褉屑邪褑懈褞.

袠褌邪泻 蟹邪写邪褔邪: 屑褘 褏芯褌懈屑 薪邪锌懈褋邪褌褜 薪械泻芯褌芯褉褍褞 锌邪褉芯写懈褞 薪邪 JUnit, 泻芯褌芯褉邪褟:

  1. 袘械褉褢褌 泻谢邪褋褋
  2. 袗薪邪谢懈蟹懈褉褍械褌 胁褋械 械谐芯 屑械褌芯写褘
  3. 袧邪褏芯写懈褌 胁褋械, 薪邪写 泻芯褌芯褉褘屑懈 褋褌芯懈褌 邪薪薪芯褌邪褑懈褟 @Test
  4. 小芯蟹写邪褢褌 写谢褟 泻邪卸写芯谐芯 褌邪泻芯谐芯 屑械褌芯写邪 薪芯胁褘泄 芯斜褗械泻褌 懈 蟹邪锌褍褋泻邪械褌 薪邪 薪褢屑 褝褌芯褌 屑械褌芯写 (褌芯褌, 薪邪写 泻芯褌芯褉褘屑 褋褌芯褟谢芯 @Test)

袝褋褌械褋褌胁械薪薪芯, 屑褘 写谢褟 锌褉芯褋褌芯褌褘 懈蟹谢芯卸械薪懈褟 芯锌褍褋褌懈屑 泻褍褔褍 薪褞邪薪褋芯胁 懈 锌褉芯写械屑芯薪褋褌褉懈褉褍械屑 芯褋薪芯胁薪褍褞 懈写械褞. 袝褋谢懈 胁邪屑 斜褍写褍褌 懈薪褌械褉械褋薪褘 写械褌邪谢懈, 锌懈褕懈褌械 胁 Slack-褔邪褌 胁芯锌褉芯褋褘, 屑褘 芯斜褟蟹邪褌械谢褜薪芯 芯褌胁械褌懈屑.

袠褌邪泻, 锌芯械褏邪谢懈 (薪邪褕 锌芯写芯锌褘褌薪褘泄)*:

package ru.netology;

import org.junit.jupiter.api.Test;

public class DemoTest {
  @Test
  public void shouldBeCalled() {
    System.out.println("Test method called");
  }

  public void shouldNotBeCalled() {
    System.out.println("Invalid method called");
  }
}

袩褉懈屑械褔邪薪懈械*: 褑械谢懈泻芯屑 泻芯写 锌褉芯械泻褌邪 胁褘 屑芯卸械褌械 薪邪泄褌懈 胁 褉械锌芯蟹懈褌芯褉懈懈 褋 泻芯写芯屑 泻 谢械泻褑懈褟屑 胁 锌褉芯械泻褌械 reflection-sample.

小芯蟹写邪褢屑 "蟹邪锌褍褋泻邪谢泻褍" 薪邪褕懈褏 褌械褋褌芯胁:

package ru.netology;

import org.junit.jupiter.api.Test;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Launcher {
  // 褔褌芯 褌邪泻芯械 懈褋泻谢褞褔械薪懈褟 屑褘 褉邪蟹斜械褉褢屑 薪邪 褋谢械写褍褞褖械泄 谢械泻褑懈懈
  public static void main(String[] args) throws IllegalAccessException, InstantiationException, InvocationTargetException {
    // 褋芯蟹写邪褢屑 芯斜褗械泻褌 褌懈锌邪 `Class` (generic'懈 屑褘 锌芯泻邪 薪械 蟹薪邪械屑, 锌芯褝褌芯屑褍 懈 褌邪泻 "褋芯泄写褢褌")
    // clazz 懈谢懈 cls - 芯斜褖械锌褉懈薪褟褌芯械 懈屑褟, 褌.泻. class - 蟹邪褉械蟹械褉胁懈褉芯胁邪薪芯
    Class clazz = DemoTest.class;
    // 斜械褉褢屑 胁褋械 屑械褌芯写褘 泻谢邪褋褋邪
    Method[] methods = clazz.getDeclaredMethods();
    // 锌械褉械斜懈褉邪械屑 屑械褌芯写褘
    for (Method method : methods) {
      // 褋屑芯褌褉懈屑, 械褋褌褜 谢懈 薪邪写 屑械褌芯写芯屑 邪薪薪芯褌邪褑懈褟 @Test
      if (method.isAnnotationPresent(Test.class)) {
        // 褋芯蟹写邪褢屑 芯斜褗械泻褌 泻谢邪褋褋邪 (newInstance 锌芯屑械褔械薪 邪薪薪芯褌邪褑懈械泄 @Deprecated, 薪芯 写谢褟 锌褉芯褋褌芯褌褘 屑褘 斜褍写械屑 懈褋锌芯谢褜蟹芯胁邪褌褜 械谐芯, 胁 锌褉芯褌懈胁薪芯屑 褋谢褍褔邪械, 薪褍卸薪芯 胁褘斜懈褉邪褌褜 泻芯薪褋褌褉褍泻褌芯褉褘)
        Object object = clazz.newInstance();
        // 胁褘蟹褘胁邪械屑 屑械褌芯写 薪邪 芯斜褗械泻褌械
        method.invoke(object);
      }
    }
  }
}

袣邪泻 胁褘 胁懈写懈褌械, 泻芯写 "薪械 芯褋芯斜芯 锌褉懈褟褌薪褘泄", 懈, 胁 斜芯谢褜褕懈薪褋褌胁械 褋谢褍褔邪械胁, 胁褘 褌邪泻芯泄 泻芯写 锌懈褋邪褌褜 薪械 斜褍写械褌械, 械褋谢懈 薪械 褋褌邪薪械褌械 褋邪屑懈 褉邪蟹褉邪斜邪褌褘胁邪褌褜 斜懈斜谢懈芯褌械泻懈 懈 懈薪褋褌褉褍屑械薪褌褘 (褌.泻. 懈薪褋褌褉褍屑械薪褌褘 褌械褋褌懈褉芯胁邪薪懈褟 褍卸械 褝褌芯 写械谢邪褞褌 蟹邪 胁邪褋).

袧芯 褋胁芯褞 褉邪斜芯褌褍 芯薪 胁褘锌芯谢薪褟械褌, 胁褘 屑芯卸械褌械 蟹邪锌褍褋褌懈褌褜, 锌芯写械斜邪卸懈褌褜, 锌芯褋屑芯褌褉械褌褜, 泻邪泻 芯薪 褉邪斜芯褌邪械褌.

袣谢褞褔械胁芯械: 胁褘 写芯谢卸薪褘 锌芯薪懈屑邪褌褜, 褔褌芯 Java 锌褉械写芯褋褌邪胁谢褟械褌 薪邪屑 懈薪褋褌褉褍屑械薪褌褘 屑邪薪懈锌褍谢懈褉芯胁邪薪懈褟 泻芯写芯屑, 泻芯褌芯褉褘械 懈 锌芯蟹胁芯谢褟褞褌 褋芯蟹写邪胁邪褌褜 褌邪泻懈械 屑芯褖薪褘械 胁械褖懈 泻邪泻 JUnit 懈 Mockito*.

袩褉懈屑械褔邪薪懈械*: 薪邪 褋邪屑芯屑 写械谢械 屑褘 薪械屑薪芯谐芯 谢褍泻邪胁懈屑, 褌.泻. Mockito 懈褋锌芯谢褜蟹褍械褌 械褖褢 懈 斜懈斜谢懈芯褌械泻褍 ByteBuddy, 泻芯褌芯褉邪褟 谐械薪械褉懈褉褍械褌 斜邪泄褌-泻芯写 薪邪 谢械褌褍 (薪芯 褝褌芯 褍卸械 褋芯胁褋械屑 写褉褍谐邪褟 懈褋褌芯褉懈褟).