一、反射
1、概念:
- 类加载:当JVM 第一次访问一个类时,这个类需要被加载到内存中;
类加载的时机:
1、建对象时
2、创建子类对象
3、调静态方法
- 反射概念:在程序运行过程中,通过反射可以使用该类中的——构造方法、属性及实例方法
二、获取构造方法、属性、方法
1、获得字节码文件; 即通过放射获取到类对象C
Class c=Class.forName("package19z20反射.Worker");
2、构造方法
2.1、所有公开构造方法的获取与单个公开构造方法的获取
Constructor[] cons1=c.getConstructors();
Constructor con3=c.getConstructor(String.class,int.class,double.class);
Object c3=con3.newInstance("张三",25,3229);
2.2、所有构造方法的获取(含私有)
Constructor[] cons2=c.getDeclaredConstructors();
Constructor con1=c.getDeclaredConstructor();
——con1.setAccessible(true);
Object c1=con1.newInstance();
3、属性的获取
3.1、公开属性
1、Field[] s1=c.getFields();
2、Field f2=c.getField("age");
f2.set(c1, 20);
3.2、私有属性
Field[] s2=c.getDeclaredFields();
Field f1=c.getDeclaredField("name");
f1.setAccessible(true);
f1.set(c1,"张三" );为c1设置属性
4、方法的获取
4.1、Class c=Class.forName("package19z20反射.Worker");
Method[] m1=c.getMethods();
4.2、获取单个方法(公开)
Method m=c.getMethod("work");
m.invoke(c2);
4.3、获取所有的方法(含私有)
Method[] m2=c.getDeclaredMethods();
4.4、获取单个私有的方法并设置属性
Method m21=c.getDeclaredMethod("work",int.class);
m21.setAccessible(true);
m21.invoke(c2, 6);