之前给大家介绍了一下java反射机制是什么的内容,那么下面要给大家详细的介绍的就是java反射机制API一起来了解一下吧。
实现Java反射机制的类都位于java.lang.reflect包中,java.lang.Class类是Java反射机制API中的核心类。
java.lang.Class类
java.lang.Class类是实现反射的关键所在,Class类的一个实例表示Java的一种数据类型,包括类、接口、枚举、注解(Annotation)、数组、基本数据类型和void,Class没有公有的构造方法,Class实例是由JVM类加载时自动创建的。
在程序代码当中获得Class实例能够通过下面的代码来进行实现:
每一种类型包括类和接口等,都有一个class静态变量能够获得Class实例,除此之外,每一个对象都有getClass()方法能够获得Class实例,这个方法是由Object类提供的实例方法。
Class类提供了很多方法能够获得运行时对象的相关信息,下面的程序代码展示了其中一些方法。
public class ReflectionTest01
{
public static void main(String[] args)
{
// 获得Class实例
// 1.通过类型class静态变量
Class clz1 = String.class;
String str = "Hello";
// 2.通过对象的getClass()方法
Class clz2 = str.getClass();
// 获得int类型Class实例
Class clz3 = int.class;
// 获得Integer类型Class实例
Class clz4 = Integer.class;
System.out.println("clz2类名称:" + clz2.getName());
System.out.println("clz2是否为接口:" + clz2.isInterface());
System.out.println("clz2是否为数组对象:" + clz2.isArray());
System.out.println("clz2父类名称:" + clz2.getSuperclass()
.getName());
System.out.println("clz2是否为基本类型:" + clz2.isPrimitive());
System.out.println("clz3是否为基本类型:" + clz3.isPrimitive());
System.out.println("clz4是否为基本类型:" + clz4.isPrimitive());
}
}
运行结果:clz2类名称:java.lang.String
clz2是否为接口:false
clz2是否为数组对象:false
clz2父类名称:java.lang.Object
clz2是否为基本类型:false
clz3是否为基本类型:true
clz4是否为基本类型:false
这里要注意一下,上面的代码当中的第10行和12行的区别,int是基本数据类型,所以输出结果为
true;Integer是类,是引用数据类型,所以输出结果为false。
java.lang.reflect包
java.lang.reflect包提供了反射中用到类说明:
示例代码:
public class ReflectionTest02
{
public static void main(String[] args)
{
try
{
// 动态加载xx类的运行时对象
Class c = Class.forName("java.lang.String");
// 获取成员方法集合
Method[] methods = c.getDeclaredMethods();
// 遍历成员方法集合
for (Method method: methods)
{
// 打印权限修饰符,如public、protected、private
System.out.print(Modifier.toString(method.getModifiers()));
// 打印返回值类型名称
System.out.print(" " + method.getReturnType()
.getName() + " ");
// 打印方法名称
System.out.println(method.getName() + "();");
}
}
catch (ClassNotFoundException e)
{
System.out.println("找不到指定类");
}
}
}
上面的代码当中第5行是通过Class的静态方法
创建某个类的运行时对象,这当中的参数是类全名字符串,假如,在类路径当中找不到这个类,那么就抛出ClassNotFoundException异常,见代码第17行。
代码第7行是通过Class的实例方法getDeclaredMethods()返回某个类的成员方法对象数组,代码第9行是遍历成员方法集合,其中的元素是Method类型。
第11行,
方法返回访问权限修饰符常量代码,是int类型。
第13行通过Method的getReturnType()方法获得方法返回值类型,之后,再调用getName()方法返回这个类型的名称。
第15行
返回方法名称。