Java 反射

1.类加载器

  1.1类的加载

    程序使用某个类时,该类加载进内存中

    通过加载,连接,初始化三步进行初始化

    1.1.1加载,读入内存,将class读入内存,并且创建一个对象

    1.1.2连接,验证,是否有正确结构

      给静态成员分配内存

      解析,将类的二进制数中符号转换为直接引用

  1.2类加载实际

    凡是用到某个类时,都全部进行加载

  1.3类加载器

    用来把class文件加载进内存,首先将Demo.class加载进方法区,之后在heap中创建一个class文件的对象。

  1.4类加载器种类

    Bootstrap classLoader根类加载器

    Extension classLoader拓展类加载器

    System classLoader系统加载器

反射的案例

     1.获取所有的构造器
        Class<?> c=Class.forName("java.lang.String");
        Constructor<?>[] p=c.getConstructors();
        for (Constructor<?> constructor : p) {
            System.out.println(constructor);
        }
     2.获取单个构造器并直接构造对象
        Class<Person> c=Person.class;
        Constructor<Person> con=c.getConstructor(String.class,int.class);
        Person p=con.newInstance("Jack",13);
        System.out.println(p);
     3.获取私有构造方法并且运行(不推荐,破坏程序的封装性)
        Class<Student> c=Student.class;
        Constructor<Student> con=c.getDeclaredConstructor(String.class,String.class);
        con.setAccessible(true);
        Student s=con.newInstance("Jack","male");
        System.out.println(s);
     4.获取成员方法并且运行
        Class<Person> c=Person.class;
        Person p=c.newInstance();
        Method method=c.getMethod("toString");
        System.out.println(method.invoke(p));
     5.泛型擦除   
        ArrayList<String> array=new ArrayList<String>();
        array.add("a");
        
        Class c=array.getClass();
        Method m=c.getMethod("add", Object.class);
        m.invoke(array,150);
        
        System.out.println(array);

 

posted @ 2019-04-04 13:03  SteveYu  阅读(197)  评论(0编辑  收藏  举报