反射

1.反射框架设计的灵魂

  框架:半成品软件。可以在框架的基础上进行软件开发,简化编码。

  反射:将类的各个组成部分封装成其他对象,这就是反射机制。要理解这句话首先得了解java代码在计算机中经历的三个阶段。

    Java代码的三个阶段:

        

 

 

 

 

2.反射的好处

  1.可以在程序运行的过程中,操作这些对象。

  2.可以解耦,来提高程序的可扩展性。

 

 

3.获取Class的三种方式

  1.Class.forName("全类名"):将字节码文件加载到内存,返回Class对象。

    1.多用于配置文件,将类名定义在配置文件中。读取文件,加载类。

  2.类名.class:通过类名的属性class来获取。

    1.多用于参数的传递

  3.对象.getClass():getClass()方法在Object类中定义。

    1.多用于对象的获取字节码的方式。

  4.示例代码

package cn.itcast.reflect;

import cn.itcast.domain.Person;

public class ReflectDemo1 {

    public static void main(String[] args) throws Exception {
        
        
        Class cls1 = Class.forName("cn.itcast.domain.Person");
        System.out.println(cls1);    //class cn.itcast.domain.Person
        
        Class cls2 = Person.class;
        System.out.println(cls2);    //class cn.itcast.domain.Person
        
        Person p = new Person();
        Class cls3 = p.getClass();
        System.out.println(cls3);    //class cn.itcast.domain.Person
        
        
        System.out.println(cls1 == cls2);//true
        System.out.println(cls1 == cls3);//true
    }
}

  5.结论:

    同一个字节码文件(*.class)在一次程序运行的过程中,只会被加载一次,无论是通过哪种方式获取的Class。

 

4.使用Class对象

  1.Class对象功能:

    1.获取功能:

      1.获取成员变量们

        1.Field[] getFields():获取所有public修饰的成员变量

        2.Field getField(String name):获取指定名称的public修饰的成员变量

        3.Field[] getDeclaredFields():获取所有的成员变量,不考虑修饰符

        4.Field getDeclaredField(String name):获取指定名称的成员变量,不考虑修饰符

        5.操作:

          1.设置值: 

             field.set(Object obj, Object value)

          2.获取值:

             field.get(Object obj)

          3.在访问非public的成员变量时可以调用setAccessible(true)来忽略访问权限修饰符的安全检查,也就是暴力反射。

      2.获取构造方法们

        1.Constructor<?>[] getConstructors()

        2.Constructor<?> getConstructors(类<?>... patameterTypes)

        3.Constructor<?> getDeclaredConstructors(类<?>... patameterTypes)

        4.Constructor<?>[] getDeclaredConstructors()

        5.操作:

          1.创建对象:

            T newInstance(Object... initargs)

            如果使用空参数构造方法创建对象,操作可以简化:Class对象的newInstance方法(如Person.class.newInstance())

      3.获取成员方法们

        1.Method[] getMethods():

        2.Method getMethod(String name, 类<?>... parameterTypes):

        3.Method[] getDeclaredMethods():

        4.Method getDeclaredMethod(String name, 类<?>... parameterTypes):

        5.操作:

          执行方法:

            Object invoke(Object obj, Object... args)

          获取方法名:

            String getName()

        4.获取类名

        1.String getName();

 

5.反射的使用案例

 

 

 

 1.配置文件pro.properties:

 

 2.框架类ReflectTest

 

 

执行框架类的main方法,就可以创建Person对象并且调用对应的Person中的方法,如果要创建其他对象如Student对象,只需修改配置文件pro.properties中的内容即可。

  

  

posted @ 2020-02-12 12:21  zihengQuan  阅读(120)  评论(0)    收藏  举报