Java教程

Java反射

本文主要是介绍Java反射,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Class类—代表字节码的类----代表类的类
Field—代表属性的类
Method—代表方法的类
Constructor—代表构造方法的类
Annotation—代表注解的类
Package—代表包的类
反射—本质上是去剖析类,获取类的字节码,产生类的实例对象

Class类

每一个Class对象实际上对应了一个类。

获取Class对象的三种方式:
1、通过类名.class来获取一个字节码对象
2、通过对象的getClass()方法来获取一个字节码对象
3、通过Class类的forName(String name)方法来获取一个字节码对象,传入的参数必须是完整路径(包名加类名)。

通过对应的Class对象获取对应的类的对象:
      Class类是不允许newClass对象的。Class类的构造方法是私有的,
      Class对象是在加载类的时候由Java虚拟机以及通过调用类的加载器的defineClass方法自动构造的。
1、如果使用的是Class对象对应类的空的构造方法,有两种方式:
      ①直接使用Class对象的newInstance()方法即可。
      ②先用Class对象的getConstructor()方法获得空的构造函数,再调用构造函数的newInstance()方法获得对象。
2、如果使用的是Class对象对应类的含参的构造方法:
      ①先用Class对象的getConstructor()方法获得含参的构造函数(方法中传入对应的参数类型的class),再调用构造函数的newInstance()方法(传入具体值)。

Class对象获取构造方法的方式

getConstructors()
返回一个包含某些(也就是只是公共构造方法)Constructor 对象的数组。

getConstructor(Class<?>…parameterTypes)
返回指定公共构造方法的 Constructor对象。(传进的参数是可变参数,可以获取空的公共的构造方法,也和获得带参数的公共的构造方法)。

getDeclaredConstructor(Class<?>…parameterTypes)返回指定构造方法 Constructor 对象。(只要是声明过的构造方法都可以获取到,包括私有的方法。因为父类的构造方法子类是不可以继承的,所以不牵扯父类的因素)
      如果要使用的构造方法不是公共的,需要调用class对象的getDeclareConstructor()方法,获取指定的构造方法。在获取之后使用之前需要暴力破解,调用该方法对象的setAccessiable()方法,参数设置为true,打破权限限制才可进行操作。

常用的方法

isAnonymousClass()当是匿名内部类时返回 true。
isLocalClass()当是方法内部类或者说局部内部类时返回 true。
isMemberClass()当是成员内部类时返回 true。
isPrimitive()判定指定的Class对象是否表示一个基本类型。
getName()以String的形式返回此Class对象所表示的类的全路径名。
getSimpleName()返回源代码中给出的底层类的简称也就是类名。

getMethod(String name, Class<?>…parameterTypes) 返回一个指定公共成员方法的Method对象。
getDeclaredMethod(String name, Class<?>…parameterTypes)返回指定已声明方法Method 对象。(只要声明了就可以获取到包括私有的方法,但是不包括从父类继承到的方法)
getMethods() 返回一个包含公共方法 Method 对象的数组(只要是它有的就可以得到。包括父类中公共的方法)。
      如果要使用的方法不是公共的。在获取到方法之后使用之前需要暴力破解,调用该方法对象的setAccessiable()方法,参数设置为true,打破权限限制才可进行操作。

getField(String name)返回一个指定公共成员属性的Field对象。
getDeclaredField(String name) 返回一个指定已声明属性的 Field 对象。
getDeclaredFields()返回所声明的所有属性Field 对象的一个数组。

Method类

getExceptionTypes()返回Class对象(代表此Method对象表示的底层方法抛出的异常类型)的数组,
getName() 以 String 形式返回此 Method 对象表示的方法名称。
getParameterTypes() 按声明顺序返回Class对象参数类型的数组。
getReturnType()返回一个代表此Method对象所表示的方法的返回类型类型。
isVarArgs() 测试方法是否带有可变数量的参数。

// 第一个参数表示方法要作用的对象
// 第二个参数表示这个方法执行所需要的参数
invoke(Object obj, Object…args) 对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。

Field类

get(Object obj)返回指定对象上此 Field 表示的属性的值。
getType() 返回一个Class对象,标识了此Field对象属性的声明类型。
set(Object obj, Object value) 将指定对象变量上此 Field 对象表示的属性设置为指定的新值。
setInt(Object obj,int i)将字段的值设置为指定对象上的一个int值。(byte、short、long、float、double、char都可以)

这篇关于Java反射的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!