JAVA常用特性:反射机制

安稳与你 提交于 2020-01-31 00:52:01

反射:

反射的本质就是通过一段字符串得到一个类的字节码文件,随后可以进行属性,方法等的操作。需要依赖Class工具类

反射可以用来解耦合;

反射可以用来进行功能的拓展。

配置文件的读取:

1.通过类加载器

2.通过创建文件夹的方式 ................. ?

 

129.如何获取一个类的字节码对象

得到字节码对象clazz的方式有三种:

1).对象名.getClass()

2).类名.class

3).Class.forName(String 全类名):包名+类名(借助Class工具类,反射的基础

130.使用三种方式获 得同一个类字节码对象,是否是同一个对象

是的,因为一个类的Class对象只有一个

131.如何使用字节码对象创建对象

Object o = clazz.newInstance(),字节码对象clazz可以直接使用newInstance()方法来创建对象,但前提是该类中存在无参构造方法。

创建对象的另外一种方式是:先使用字节码对象获取构造方法,再利用构造方法调用newInstance(参数列表)方法创建对象。

132.如何使用字节码对象获取公共访问权限的构造方法的数组

Constructor<?>[] c1 = clazz.getConstructors(),使用字节码对象clazz调用getConstructors()方法,来获得public修饰的构造方法的数组

133.如何使用字节码对象获取所有构造方法的数组

Constructor<?>[] c2 = clazz.getDeclaredConstructors(),使用字节码对象clazz调用getDeclaredConstructors()方法,来获得任意权限的构造方法组成的数组

134.如何使用字节码对象获取某个构造方法,并创建对象

Constructor<?> c3 = clazz.getConstructor(Class 参数列表),参数列表是任意类型的字节码对象,比如String.class,int.class等,如果是无参构造方法,则传一个null就可以了。之后Object o = c3.newInstance(参数列表),参数是类中构造方法要传入的参数。创建Object类型的对象。

135.如何使用字节码对象获取公共访问权限的类中变量的数组

Field[] fields = clazz.getFields(),

136.如何使用字节码对象获取类中所有变量的数组

Field[] Fields1 = clazz.getDeclaredFields()

137.如何使用字节码对象获取某个变量,并为某个对象的该属性赋值

需要先创建一个对象,之后利用set(Object obj,Object value)方法给变量赋值。

Object o = clazz.newInstance(),利用字节码对象创建对象,o实际类型与该类相同

Field f1 = clazz.getField(属性名),获取单个公共属性,属性名是类中定义的属性名。

F1.set(o,属性值),给属性赋值。

注:调用静态变量可以使用null代替对象o,因为静态变量不依赖与对象存在

138.如何使用字节码对象获取公共访问权限的方法的数组

Method[] methods = clazz.getMethods();

139.如何使用字节码对象获取所有方法的数组

Method[] ds = clazz.getDeclaredMethods();

140.如何使用字节码对象获取某个方法,并使用某个对象调用该方法

需要先创建一个对象,之后利用invoke(Object obj,Object..args)方法调用类中的成员方法

Object o = clazz.newInstance(),利用字节码对象创建对象,o实际类型与该类相同

Method m = clazz.getMethod(String 方法名,Class…args),获取public修饰的方法

m.invoke(o,参数列表),方法m中的参数,没有可以不写。

注:调用静态方法可以使用null代替对象o,因为静态方法不依赖与对象存在

141.如何使用暴力方法访问私有的属性、方法、构造方法

私有的属性、方法、构造方法必须同过暴力访问方式获得,使用属性、方法、构造方法对象调用setAccessible(boolean b)方法,将布尔类型的参数设为true,实现暴力访问。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!