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);