反射一共三种方法:

    1. //假如有个类:Foo
    2. 三种方法如下:
    3. Class cla = Foo.getClass();
    4. Class cla = Foo.class ;
    5. Class cla = Class.forName( "xx.xx.Foo" );

    这几天温习aop的时候,发现要想掌握熟练还是需要深刻理解动态代理以及反射机制,所以就回头温习了下黑马的反射。
    具体如下,其也是IOC核心思想的来源,在不主动创建类的时候,由反射机制给我们创建,我们只需要修改配置文件就可以决定创建哪个类,以及执行什么方法。
    比如创建一个类Person

    1. package domain;
    2. @Data
    3. public class Person {
    4. private String name;
    5. private int age;
    6. public void eat() {
    7. System.out.println("Person --- eating...");
    8. }
    9. public void eat(String food) {
    10. System.out.println("you are eatting "+food);
    11. }
    12. }

    然后以下就是反射的一些常用方法

    1. package domain;
    2. import java.lang.reflect.Constructor;
    3. import java.lang.reflect.Field;
    4. import java.lang.reflect.Method;
    5. public class ReflectDemo1 {
    6. public static void main(String[] args) throws Exception{
    7. Class personClass=Person.class;
    8. Method eat = personClass.getMethod("eat");
    9. Person p = new Person();
    10. Object invoke = eat.invoke(p);
    11. System.out.println(eat);
    12. System.out.println("============================");
    13. System.out.println(invoke);
    14. System.out.println("============================");
    15. Method eat1 = personClass.getMethod("eat", String.class);
    16. Object invoke1 = eat1.invoke(p,"fan");
    17. System.out.println(invoke1);
    18. Method[] declaredMethods = personClass.getDeclaredMethods();
    19. for (Method method :declaredMethods
    20. ) {
    21. System.out.println(method);
    22. }
    23. Method[] methods = personClass.getMethods();
    24. for (Method method:methods
    25. ) {
    26. System.out.println(method);
    27. }
    28. Constructor constructor = personClass.getConstructor(String.class, int.class);
    29. Object obj = constructor.newInstance("wangw", 5);
    30. System.out.println(obj);
    31. Constructor[] constructors = personClass.getConstructors();
    32. for (Constructor c : constructors) {
    33. System.out.println(c);
    34. }
    35. Field[] fields = personClass.getFields();//获取 public修饰的成员变量
    36. for (Field field : fields
    37. ) {
    38. System.out.println(field);
    39. }
    40. Field[] declaredFields = personClass.getDeclaredFields();
    41. for (Field field : declaredFields) {
    42. System.out.println(field);
    43. }
    44. Class<?> cls1 = Class.forName("domain.Person");
    45. //多用于配置文件
    46. System.out.println(cls1);
    47. System.out.println("====================");
    48. Class cls2 = Person.class;
    49. //多用于参数传递
    50. System.out.println(cls2);
    51. System.out.println("====================");
    52. Person person = new Person();
    53. //多用于对象获取字节码的方式
    54. System.out.println(person.getClass());
    55. }
    56. }

    最后以一个案例结尾
    java反射 - 图1

    java反射 - 图2