反射

反射:

当一个字节码文件加载到内存的时候,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,”小米”);

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容