diff --git a/reflection/pom.xml b/reflection/pom.xml index d3e5b16231..10a6d7df0c 100644 --- a/reflection/pom.xml +++ b/reflection/pom.xml @@ -12,8 +12,8 @@ maven-compiler-plugin 3.3 - 7 - 7 + 8 + 8 diff --git a/reflection/src/main/java/com/baeldung/reflection/Animal.java b/reflection/src/main/java/com/baeldung/reflection/Animal.java index 02269cf201..f35f3b626c 100644 --- a/reflection/src/main/java/com/baeldung/reflection/Animal.java +++ b/reflection/src/main/java/com/baeldung/reflection/Animal.java @@ -1,25 +1,27 @@ package com.baeldung.reflection; -public abstract class Animal implements Eating{ - public static final String CATEGORY = "domestic"; - private String name; +public abstract class Animal implements Eating { - public Animal(String name) { - this.name = name; - } + public static final String CATEGORY = "domestic"; - public String getName() { - return name; - } + private String name; - public void setName(String name) { - this.name = name; - } + public Animal(String name) { + this.name = name; + } - public String makeSound() { - return getSound(); - } + public String getName() { + return name; + } - protected abstract String getSound(); + public void setName(String name) { + this.name = name; + } + + public String makeSound() { + return getSound(); + } + + protected abstract String getSound(); } diff --git a/reflection/src/main/java/com/baeldung/reflection/Bird.java b/reflection/src/main/java/com/baeldung/reflection/Bird.java index eb7115c53a..f5bb0f9b19 100644 --- a/reflection/src/main/java/com/baeldung/reflection/Bird.java +++ b/reflection/src/main/java/com/baeldung/reflection/Bird.java @@ -1,33 +1,36 @@ package com.baeldung.reflection; public class Bird extends Animal { - private boolean walks; - public Bird() { - super("bird"); - } - public Bird(String name, boolean walks) { - super(name); - setWalks(walks); - } - public Bird(String name) { - super(name); - } + private boolean walks; - @Override - public String eats() { - return "grains"; - } + public Bird() { + super("bird"); + } - @Override - protected String getSound() { - return "chaps"; - } + public Bird(String name, boolean walks) { + super(name); + setWalks(walks); + } - public boolean walks() { - return walks; - } + public Bird(String name) { + super(name); + } - public void setWalks(boolean walks) { - this.walks = walks; - } + @Override + public String eats() { + return "grains"; + } + + @Override + protected String getSound() { + return "chaps"; + } + + public boolean walks() { + return walks; + } + + public void setWalks(boolean walks) { + this.walks = walks; + } } diff --git a/reflection/src/main/java/com/baeldung/reflection/Eating.java b/reflection/src/main/java/com/baeldung/reflection/Eating.java index c6fdd39123..c959becf00 100644 --- a/reflection/src/main/java/com/baeldung/reflection/Eating.java +++ b/reflection/src/main/java/com/baeldung/reflection/Eating.java @@ -1,5 +1,5 @@ package com.baeldung.reflection; public interface Eating { - String eats(); + String eats(); } diff --git a/reflection/src/main/java/com/baeldung/reflection/Goat.java b/reflection/src/main/java/com/baeldung/reflection/Goat.java index 9dc69f626b..086d09d543 100644 --- a/reflection/src/main/java/com/baeldung/reflection/Goat.java +++ b/reflection/src/main/java/com/baeldung/reflection/Goat.java @@ -1,24 +1,24 @@ package com.baeldung.reflection; -public class Goat extends Animal implements Locomotion{ +public class Goat extends Animal implements Locomotion { - public Goat(String name) { - super(name); - } + public Goat(String name) { + super(name); + } - @Override - protected String getSound() { - return "bleat"; - } + @Override + protected String getSound() { + return "bleat"; + } - @Override - public String getLocomotion() { - return "walks"; - } + @Override + public String getLocomotion() { + return "walks"; + } - @Override - public String eats() { - return "grass"; - } + @Override + public String eats() { + return "grass"; + } } diff --git a/reflection/src/main/java/com/baeldung/reflection/Locomotion.java b/reflection/src/main/java/com/baeldung/reflection/Locomotion.java index e736ac7e02..230fd9a466 100644 --- a/reflection/src/main/java/com/baeldung/reflection/Locomotion.java +++ b/reflection/src/main/java/com/baeldung/reflection/Locomotion.java @@ -1,5 +1,5 @@ package com.baeldung.reflection; public interface Locomotion { - String getLocomotion(); + String getLocomotion(); } diff --git a/reflection/src/main/java/com/baeldung/reflection/Person.java b/reflection/src/main/java/com/baeldung/reflection/Person.java index 66250f8da1..1a1fafef93 100644 --- a/reflection/src/main/java/com/baeldung/reflection/Person.java +++ b/reflection/src/main/java/com/baeldung/reflection/Person.java @@ -1,6 +1,6 @@ package com.baeldung.reflection; public class Person { - private String name; - private int age; + private String name; + private int age; } diff --git a/reflection/src/test/java/com/baeldung/reflection/ReflectionTest.java b/reflection/src/test/java/com/baeldung/reflection/ReflectionTest.java index 7eb0c35671..180ea38098 100644 --- a/reflection/src/test/java/com/baeldung/reflection/ReflectionTest.java +++ b/reflection/src/test/java/com/baeldung/reflection/ReflectionTest.java @@ -1,316 +1,323 @@ package com.baeldung.reflection; -import static org.junit.Assert.*; - -import java.lang.reflect.*; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - import org.junit.Test; +import java.lang.reflect.*; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Stream; + +import static java.util.stream.Collectors.toList; +import static org.junit.Assert.*; + public class ReflectionTest { - @Test - public void givenObject_whenGetsFieldNamesAtRuntime_thenCorrect() { - Object person = new Person(); - Field[] fields = person.getClass().getDeclaredFields(); - List expectedFieldNames = Arrays.asList(new String[] { "name", - "age" }); - List actualFieldNames = new ArrayList<>(); - for (Field field : fields) - actualFieldNames.add(field.getName()); + @Test + public void givenObject_whenGetsFieldNamesAtRuntime_thenCorrect() { + Object person = new Person(); + Field[] fields = person.getClass().getDeclaredFields(); - assertTrue(expectedFieldNames.containsAll(actualFieldNames)); + List actualFieldNames = getFieldNames(fields); - } + assertTrue(Arrays.asList("name", "age") + .containsAll(actualFieldNames)); - @Test - public void givenObject_whenGetsClassName_thenCorrect() { - Object goat = new Goat("goat"); - Class clazz = goat.getClass(); - assertEquals("Goat", clazz.getSimpleName()); - assertEquals("com.baeldung.reflection.Goat", clazz.getName()); - assertEquals("com.baeldung.reflection.Goat", clazz.getCanonicalName()); - } + } - @Test - public void givenClassName_whenCreatesObject_thenCorrect() - throws ClassNotFoundException { - Class clazz = Class.forName("com.baeldung.reflection.Goat"); - assertEquals("Goat", clazz.getSimpleName()); - assertEquals("com.baeldung.reflection.Goat", clazz.getName()); - assertEquals("com.baeldung.reflection.Goat", clazz.getCanonicalName()); - } + @Test + public void givenObject_whenGetsClassName_thenCorrect() { + Object goat = new Goat("goat"); + Class clazz = goat.getClass(); - @Test - public void givenClass_whenRecognisesModifiers_thenCorrect() - throws ClassNotFoundException { - Class goatClass = Class.forName("com.baeldung.reflection.Goat"); - Class animalClass = Class.forName("com.baeldung.reflection.Animal"); - int goatMods = goatClass.getModifiers(); - int animalMods = animalClass.getModifiers(); - assertTrue(Modifier.isPublic(goatMods)); - assertTrue(Modifier.isAbstract(animalMods)); - assertTrue(Modifier.isPublic(animalMods)); - } + assertEquals("Goat", clazz.getSimpleName()); + assertEquals("com.baeldung.reflection.Goat", clazz.getName()); + assertEquals("com.baeldung.reflection.Goat", clazz.getCanonicalName()); + } - @Test - public void givenClass_whenGetsPackageInfo_thenCorrect() { - Goat goat = new Goat("goat"); - Class goatClass = goat.getClass(); - Package pkg = goatClass.getPackage(); - assertEquals("com.baeldung.reflection", pkg.getName()); - } + @Test + public void givenClassName_whenCreatesObject_thenCorrect() + throws ClassNotFoundException { + Class clazz = Class.forName("com.baeldung.reflection.Goat"); - @Test - public void givenClass_whenGetsSuperClass_thenCorrect() { - Goat goat = new Goat("goat"); - String str = "any string"; + assertEquals("Goat", clazz.getSimpleName()); + assertEquals("com.baeldung.reflection.Goat", clazz.getName()); + assertEquals("com.baeldung.reflection.Goat", clazz.getCanonicalName()); + } - Class goatClass = goat.getClass(); - Class goatSuperClass = goatClass.getSuperclass(); + @Test + public void givenClass_whenRecognisesModifiers_thenCorrect() + throws ClassNotFoundException { + Class goatClass = Class.forName("com.baeldung.reflection.Goat"); + Class animalClass = Class.forName("com.baeldung.reflection.Animal"); + int goatMods = goatClass.getModifiers(); + int animalMods = animalClass.getModifiers(); - assertEquals("Animal", goatSuperClass.getSimpleName()); - assertEquals("Object", str.getClass().getSuperclass().getSimpleName()); + assertTrue(Modifier.isPublic(goatMods)); + assertTrue(Modifier.isAbstract(animalMods)); + assertTrue(Modifier.isPublic(animalMods)); + } - } + @Test + public void givenClass_whenGetsPackageInfo_thenCorrect() { + Goat goat = new Goat("goat"); + Class goatClass = goat.getClass(); + Package pkg = goatClass.getPackage(); - @Test - public void givenClass_whenGetsImplementedInterfaces_thenCorrect() - throws ClassNotFoundException { - Class goatClass = Class.forName("com.baeldung.reflection.Goat"); - Class animalClass = Class.forName("com.baeldung.reflection.Animal"); - Class[] goatInterfaces = goatClass.getInterfaces(); - Class[] animalInterfaces = animalClass.getInterfaces(); - assertEquals(1, goatInterfaces.length); - assertEquals(1, animalInterfaces.length); - assertEquals("Locomotion", goatInterfaces[0].getSimpleName()); - assertEquals("Eating", animalInterfaces[0].getSimpleName()); - } + assertEquals("com.baeldung.reflection", pkg.getName()); + } - @Test - public void givenClass_whenGetsConstructor_thenCorrect() - throws ClassNotFoundException { - Class goatClass = Class.forName("com.baeldung.reflection.Goat"); - Constructor[] constructors = goatClass.getConstructors(); - assertEquals(1, constructors.length); - assertEquals("com.baeldung.reflection.Goat", constructors[0].getName()); - } + @Test + public void givenClass_whenGetsSuperClass_thenCorrect() { + Goat goat = new Goat("goat"); + String str = "any string"; - @Test - public void givenClass_whenGetsFields_thenCorrect() - throws ClassNotFoundException { - Class animalClass = Class.forName("com.baeldung.reflection.Animal"); - Field[] fields = animalClass.getDeclaredFields(); - List expectedFields = Arrays.asList(new String[] { "name", - "CATEGORY" }); - List actualFields = new ArrayList<>(); - for (Field field : fields) - actualFields.add(field.getName()); - assertEquals(2, actualFields.size()); - assertTrue(actualFields.containsAll(expectedFields)); - } + Class goatClass = goat.getClass(); + Class goatSuperClass = goatClass.getSuperclass(); - @Test - public void givenClass_whenGetsMethods_thenCorrect() - throws ClassNotFoundException { - Class animalClass = Class.forName("com.baeldung.reflection.Animal"); - Method[] methods = animalClass.getDeclaredMethods(); - List expectedMethods = Arrays.asList(new String[] { "getName", - "setName", "getSound", "makeSound" }); - List actualMethods = new ArrayList<>(); - for (Method method : methods) - actualMethods.add(method.getName()); - assertEquals(4, actualMethods.size()); - assertTrue(actualMethods.containsAll(expectedMethods)); + assertEquals("Animal", goatSuperClass.getSimpleName()); + assertEquals("Object", str.getClass().getSuperclass().getSimpleName()); - } + } - @Test - public void givenClass_whenGetsAllConstructors_thenCorrect() - throws ClassNotFoundException { - Class birdClass = Class.forName("com.baeldung.reflection.Bird"); - Constructor[] constructors = birdClass.getConstructors(); - assertEquals(3, constructors.length); - } + @Test + public void givenClass_whenGetsImplementedInterfaces_thenCorrect() + throws ClassNotFoundException { + Class goatClass = Class.forName("com.baeldung.reflection.Goat"); + Class animalClass = Class.forName("com.baeldung.reflection.Animal"); + Class[] goatInterfaces = goatClass.getInterfaces(); + Class[] animalInterfaces = animalClass.getInterfaces(); - @Test - public void givenClass_whenGetsEachConstructorByParamTypes_thenCorrect() - throws ClassNotFoundException, NoSuchMethodException, - SecurityException { - Class birdClass = Class.forName("com.baeldung.reflection.Bird"); - Constructor cons1 = birdClass.getConstructor(); - Constructor cons2 = birdClass.getConstructor(String.class); - Constructor cons3 = birdClass.getConstructor(String.class, - boolean.class); - } + assertEquals(1, goatInterfaces.length); + assertEquals(1, animalInterfaces.length); + assertEquals("Locomotion", goatInterfaces[0].getSimpleName()); + assertEquals("Eating", animalInterfaces[0].getSimpleName()); + } - @Test - public void givenClass_whenInstantiatesObjectsAtRuntime_thenCorrect() - throws ClassNotFoundException, NoSuchMethodException, - SecurityException, InstantiationException, IllegalAccessException, - IllegalArgumentException, InvocationTargetException { - Class birdClass = Class.forName("com.baeldung.reflection.Bird"); - Constructor cons1 = birdClass.getConstructor(); - Constructor cons2 = birdClass.getConstructor(String.class); - Constructor cons3 = birdClass.getConstructor(String.class, - boolean.class); - Bird bird1 = (Bird) cons1.newInstance(); - Bird bird2 = (Bird) cons2.newInstance("Weaver bird"); - Bird bird3 = (Bird) cons3.newInstance("dove", true); - assertEquals("bird", bird1.getName()); - assertEquals("Weaver bird", bird2.getName()); - assertEquals("dove", bird3.getName()); - assertFalse(bird1.walks()); - assertTrue(bird3.walks()); - } + @Test + public void givenClass_whenGetsConstructor_thenCorrect() + throws ClassNotFoundException { + Class goatClass = Class.forName("com.baeldung.reflection.Goat"); + Constructor[] constructors = goatClass.getConstructors(); - @Test - public void givenClass_whenGetsPublicFields_thenCorrect() - throws ClassNotFoundException { - Class birdClass = Class.forName("com.baeldung.reflection.Bird"); - Field[] fields = birdClass.getFields(); - assertEquals(1, fields.length); - assertEquals("CATEGORY", fields[0].getName()); + assertEquals(1, constructors.length); + assertEquals("com.baeldung.reflection.Goat", constructors[0].getName()); + } - } + @Test + public void givenClass_whenGetsFields_thenCorrect() + throws ClassNotFoundException { + Class animalClass = Class.forName("com.baeldung.reflection.Animal"); + Field[] fields = animalClass.getDeclaredFields(); - @Test - public void givenClass_whenGetsPublicFieldByName_thenCorrect() - throws ClassNotFoundException, NoSuchFieldException, - SecurityException { - Class birdClass = Class.forName("com.baeldung.reflection.Bird"); - Field field = birdClass.getField("CATEGORY"); - assertEquals("CATEGORY", field.getName()); + List actualFields = getFieldNames(fields); - } + assertEquals(2, actualFields.size()); + assertTrue(actualFields.containsAll(Arrays.asList("name", "CATEGORY"))); + } - @Test - public void givenClass_whenGetsDeclaredFields_thenCorrect() - throws ClassNotFoundException { - Class birdClass = Class.forName("com.baeldung.reflection.Bird"); - Field[] fields = birdClass.getDeclaredFields(); - assertEquals(1, fields.length); - assertEquals("walks", fields[0].getName()); - } + @Test + public void givenClass_whenGetsMethods_thenCorrect() + throws ClassNotFoundException { + Class animalClass = Class.forName("com.baeldung.reflection.Animal"); + Method[] methods = animalClass.getDeclaredMethods(); + List actualMethods = getMethodNames(methods); - @Test - public void givenClass_whenGetsFieldsByName_thenCorrect() - throws ClassNotFoundException, NoSuchFieldException, - SecurityException { - Class birdClass = Class.forName("com.baeldung.reflection.Bird"); - Field field = birdClass.getDeclaredField("walks"); - assertEquals("walks", field.getName()); + assertEquals(4, actualMethods.size()); + assertTrue(actualMethods.containsAll(Arrays.asList("getName", + "setName", "getSound", "makeSound"))); + } - } + @Test + public void givenClass_whenGetsAllConstructors_thenCorrect() + throws ClassNotFoundException { + Class birdClass = Class.forName("com.baeldung.reflection.Bird"); + Constructor[] constructors = birdClass.getConstructors(); - @Test - public void givenClassField_whenGetsType_thenCorrect() - throws ClassNotFoundException, NoSuchFieldException, - SecurityException { - Field field = Class.forName("com.baeldung.reflection.Bird") - .getDeclaredField("walks"); - Class fieldClass = field.getType(); - assertEquals("boolean", fieldClass.getSimpleName()); - } + assertEquals(3, constructors.length); + } - @Test - public void givenClassField_whenSetsAndGetsValue_thenCorrect() - throws ClassNotFoundException, NoSuchFieldException, - SecurityException, InstantiationException, IllegalAccessException { - Class birdClass = Class.forName("com.baeldung.reflection.Bird"); - Bird bird = (Bird) birdClass.newInstance(); - Field field = birdClass.getDeclaredField("walks"); - field.setAccessible(true); + @Test + public void givenClass_whenGetsEachConstructorByParamTypes_thenCorrect() + throws Exception { + Class birdClass = Class.forName("com.baeldung.reflection.Bird"); + Constructor cons1 = birdClass.getConstructor(); + Constructor cons2 = birdClass.getConstructor(String.class); + Constructor cons3 = birdClass.getConstructor(String.class, + boolean.class); + } - assertFalse(field.getBoolean(bird)); - assertFalse(bird.walks()); + @Test + public void givenClass_whenInstantiatesObjectsAtRuntime_thenCorrect() + throws Exception { + Class birdClass = Class.forName("com.baeldung.reflection.Bird"); - field.set(bird, true); + Constructor cons1 = birdClass.getConstructor(); + Constructor cons2 = birdClass.getConstructor(String.class); + Constructor cons3 = birdClass.getConstructor(String.class, + boolean.class); - assertTrue(field.getBoolean(bird)); - assertTrue(bird.walks()); + Bird bird1 = (Bird) cons1.newInstance(); + Bird bird2 = (Bird) cons2.newInstance("Weaver bird"); + Bird bird3 = (Bird) cons3.newInstance("dove", true); - } + assertEquals("bird", bird1.getName()); + assertEquals("Weaver bird", bird2.getName()); + assertEquals("dove", bird3.getName()); + assertFalse(bird1.walks()); + assertTrue(bird3.walks()); + } - @Test - public void givenClassField_whenGetsAndSetsWithNull_thenCorrect() - throws ClassNotFoundException, InstantiationException, - IllegalAccessException, NoSuchFieldException, SecurityException { - Class birdClass = Class.forName("com.baeldung.reflection.Bird"); - Field field = birdClass.getField("CATEGORY"); - field.setAccessible(true); + @Test + public void givenClass_whenGetsPublicFields_thenCorrect() + throws ClassNotFoundException { + Class birdClass = Class.forName("com.baeldung.reflection.Bird"); + Field[] fields = birdClass.getFields(); + assertEquals(1, fields.length); + assertEquals("CATEGORY", fields[0].getName()); - assertEquals("domestic", field.get(null)); - } + } - @Test - public void givenClass_whenGetsAllPublicMethods_thenCorrect() - throws ClassNotFoundException { - Class birdClass = Class.forName("com.baeldung.reflection.Bird"); - Method[] methods = birdClass.getMethods(); - List methodNames = new ArrayList<>(); - for (Method method : methods) - methodNames.add(method.getName()); - assertTrue(methodNames.containsAll(Arrays - .asList(new String[] { "equals", "notifyAll", "hashCode", - "walks", "eats", "toString" }))); + @Test + public void givenClass_whenGetsPublicFieldByName_thenCorrect() + throws Exception { + Class birdClass = Class.forName("com.baeldung.reflection.Bird"); + Field field = birdClass.getField("CATEGORY"); + assertEquals("CATEGORY", field.getName()); - } + } - @Test - public void givenClass_whenGetsOnlyDeclaredMethods_thenCorrect() - throws ClassNotFoundException { - Class birdClass = Class.forName("com.baeldung.reflection.Bird"); - Method[] methods = birdClass.getDeclaredMethods(); - List expectedMethodNames = Arrays.asList(new String[] { - "setWalks", "walks", "getSound", "eats" }); - List actualMethodNames = new ArrayList<>(); - for (Method method : methods) - actualMethodNames.add(method.getName()); - assertEquals(expectedMethodNames.size(), actualMethodNames.size()); - assertTrue(expectedMethodNames.containsAll(actualMethodNames)); - assertTrue(actualMethodNames.containsAll(expectedMethodNames)); + @Test + public void givenClass_whenGetsDeclaredFields_thenCorrect() + throws ClassNotFoundException { + Class birdClass = Class.forName("com.baeldung.reflection.Bird"); + Field[] fields = birdClass.getDeclaredFields(); + assertEquals(1, fields.length); + assertEquals("walks", fields[0].getName()); + } - } + @Test + public void givenClass_whenGetsFieldsByName_thenCorrect() + throws Exception { + Class birdClass = Class.forName("com.baeldung.reflection.Bird"); + Field field = birdClass.getDeclaredField("walks"); + assertEquals("walks", field.getName()); - @Test - public void givenMethodName_whenGetsMethod_thenCorrect() - throws ClassNotFoundException, NoSuchMethodException, - SecurityException { - Class birdClass = Class.forName("com.baeldung.reflection.Bird"); - Method walksMethod = birdClass.getDeclaredMethod("walks"); - Method setWalksMethod = birdClass.getDeclaredMethod("setWalks", - boolean.class); - assertFalse(walksMethod.isAccessible()); - assertFalse(setWalksMethod.isAccessible()); - walksMethod.setAccessible(true); - setWalksMethod.setAccessible(true); - assertTrue(walksMethod.isAccessible()); - assertTrue(setWalksMethod.isAccessible()); + } - } + @Test + public void givenClassField_whenGetsType_thenCorrect() + throws Exception { + Field field = Class.forName("com.baeldung.reflection.Bird") + .getDeclaredField("walks"); + Class fieldClass = field.getType(); + assertEquals("boolean", fieldClass.getSimpleName()); + } - @Test - public void givenMethod_whenInvokes_thenCorrect() - throws ClassNotFoundException, NoSuchMethodException, - SecurityException, IllegalAccessException, - IllegalArgumentException, InvocationTargetException, - InstantiationException { - Class birdClass = Class.forName("com.baeldung.reflection.Bird"); - Bird bird = (Bird) birdClass.newInstance(); - Method setWalksMethod = birdClass.getDeclaredMethod("setWalks", - boolean.class); - Method walksMethod = birdClass.getDeclaredMethod("walks"); - boolean walks = (boolean) walksMethod.invoke(bird); - assertFalse(walks); - assertFalse(bird.walks()); - setWalksMethod.invoke(bird, true); - boolean walks2 = (boolean) walksMethod.invoke(bird); - assertTrue(walks2); - assertTrue(bird.walks()); + @Test + public void givenClassField_whenSetsAndGetsValue_thenCorrect() + throws Exception { + Class birdClass = Class.forName("com.baeldung.reflection.Bird"); + Bird bird = (Bird) birdClass.newInstance(); + Field field = birdClass.getDeclaredField("walks"); + field.setAccessible(true); - } + assertFalse(field.getBoolean(bird)); + assertFalse(bird.walks()); + + field.set(bird, true); + + assertTrue(field.getBoolean(bird)); + assertTrue(bird.walks()); + + } + + @Test + public void givenClassField_whenGetsAndSetsWithNull_thenCorrect() + throws Exception { + Class birdClass = Class.forName("com.baeldung.reflection.Bird"); + Field field = birdClass.getField("CATEGORY"); + field.setAccessible(true); + + assertEquals("domestic", field.get(null)); + } + + @Test + public void givenClass_whenGetsAllPublicMethods_thenCorrect() + throws ClassNotFoundException { + Class birdClass = Class.forName("com.baeldung.reflection.Bird"); + Method[] methods = birdClass.getMethods(); + List methodNames = getMethodNames(methods); + + assertTrue(methodNames.containsAll(Arrays + .asList("equals", "notifyAll", "hashCode", + "walks", "eats", "toString"))); + + } + + @Test + public void givenClass_whenGetsOnlyDeclaredMethods_thenCorrect() + throws ClassNotFoundException { + Class birdClass = Class.forName("com.baeldung.reflection.Bird"); + List actualMethodNames = getMethodNames(birdClass.getDeclaredMethods()); + + List expectedMethodNames = Arrays.asList("setWalks", "walks", "getSound", "eats"); + + assertEquals(expectedMethodNames.size(), actualMethodNames.size()); + assertTrue(expectedMethodNames.containsAll(actualMethodNames)); + assertTrue(actualMethodNames.containsAll(expectedMethodNames)); + + } + + @Test + public void givenMethodName_whenGetsMethod_thenCorrect() + throws Exception { + Class birdClass = Class.forName("com.baeldung.reflection.Bird"); + Method walksMethod = birdClass.getDeclaredMethod("walks"); + Method setWalksMethod = birdClass.getDeclaredMethod("setWalks", + boolean.class); + + assertFalse(walksMethod.isAccessible()); + assertFalse(setWalksMethod.isAccessible()); + + walksMethod.setAccessible(true); + setWalksMethod.setAccessible(true); + + assertTrue(walksMethod.isAccessible()); + assertTrue(setWalksMethod.isAccessible()); + + } + + @Test + public void givenMethod_whenInvokes_thenCorrect() + throws Exception { + Class birdClass = Class.forName("com.baeldung.reflection.Bird"); + Bird bird = (Bird) birdClass.newInstance(); + Method setWalksMethod = birdClass.getDeclaredMethod("setWalks", + boolean.class); + Method walksMethod = birdClass.getDeclaredMethod("walks"); + boolean walks = (boolean) walksMethod.invoke(bird); + + assertFalse(walks); + assertFalse(bird.walks()); + + setWalksMethod.invoke(bird, true); + boolean walks2 = (boolean) walksMethod.invoke(bird); + + assertTrue(walks2); + assertTrue(bird.walks()); + + } + + private static List getMethodNames(Method[] methods) { + return Stream.of(methods) + .map((Method::getName)) + .collect(toList()); + } + + private static List getFieldNames(Field[] fields) { + return Stream.of(fields) + .map(Field::getName) + .collect(toList()); + } }