反射:
当一个字节码文件加载到内存的时候,jvm会对该字节码进行解剖,然后会创建一个对象的Class对象,把字节码文件的信息全部都存储到该Class对象中,我们只要获取到Class对象,就可以使用字节码对象设置对象的属性或者调用对象的方法等操作。。。
注意:在反射技术中一个类的任何成员都有对应的类进行描述。比如:成员变量(Field)
方法--->Method类
获取Class对象:
1.推荐使用:
Class c1 = Class.forName(完整类名=包名+类名)
Class c1 = Class.forName(cn.itcast.reflect.Person);
2.通过类名获取
Class c2 =类名.class;
Class c2 = Person.class;
3.通过对象获取
Class c3 = new类名().getClass();
Class c3 = new Person().getClass();
通过Class对象获取对应的构造方法
Class c = Class.forName(cn.itcast.reflect.Person);
1.getConstructors()获取一个类的所有公共的构造方法
Constructor[] constructors = c.getConstructors();
2.getDeclaredConstructors()获取一个类的所有构造方法
Constructor[] constructors = c.getDeclaredConstructors();
3.getDeclaredConstructor(指定参数)根据指定参数获取指定(私有或者公共)构造函数
Constructor constructor = c.getDeclaredConstructor(int.class,String.class);
4.getConstructor(指定参数)根据指定参数获取指定公共构造函数
Constructor constructor = c.getConstructor(int.class,String.class);
根据构造函数创建对象
//如果是私有构造函数需要设置反射权限
constructor.setAccessible(true);
Person p = (Person)constructor.newInstance(999,”小米”);//创建一个对象
根据Class对象获取方法
1.getMethods获取所有公共方法
Method[] methods = c.getMethods();
2.getDeclaredMethods获取所有方法
Method[] methods = c.getDeclaredMethods();
3.getMethod(指定参数)获取指定公共方法
Method method = c.getMethod(“eat”,int.class);//第一个参数:方法名字;第二个参数:方法需要的参数
method.invoke(p,6);//invoke执行一个方法。第一个参数:方法的调用对象;第二个参数:方法需要的参数。
4.getDeclaredMethod(指定参数)获取指定(私有或者公共)方法
Methodmethod = c.getDeclaredMethod(“sleep”,int.class);
//如果是私有方法需要设置访问权限
method.setAccessible(true);
method.invoke(p,6);
//如果调用方法是static静态方法,第一个参数为null
method.invoke(null,7);
根据Class对象获取成员变量
1.getFields获取所有公共变量
Field[] fields = c.getFields();
2.getDeclaredFields获取所有变量
Field[] fields = c.getDeclaredFields();
3.getMethod(指定参数)获取指定公共变量
Field field = c.getField(“id”);//参数:变量名字
field.set(p,”小米”);//set设置参数属性值。第一个参数:变量的设置对象;第二个参数:变量的值。
4.getDeclaredField(指定参数)获取指定(私有或者公共)变量
Fieldfield = c.getDeclaredField(“id”);
//如果是私有变量需要设置访问权限
field.setAccessible(true);
field.set(p,”小米”);
//如果变量是static静态的,第一个参数为null
field.set(null,”小米”);