老生常谈老生常谈Java反射机制反射机制(必看篇必看篇)
下面小编就为大家带来一篇老生常谈Java反射机制(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个
参考。一起跟随小编过来看看吧
什么是反射机制什么是反射机制
反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作。例如它允许
一个java的类获取他所有的成员变量和方法并且显示出来。这个能特定我们不常看到,但是在其他的比如C或者C++语言中很不就存
在这个特性。一个常见的例子是在JavaBean中,一些组件可以通过一个构造器来操作。这个构造器就是用的反射在动态加载的时候
来获取的java中类的属性的。
主要的类主要的类
Class 类的实例表示正在运行的 Java 应用程序中的类和接口。Class没有公共的构造方法,Class 对象是在加载类时由 Java 虚拟机
以及通过调用类加载器中的 defineClass 方法自动构造的
Constructor 提供关于类的单个构造方法的信息以及对它的访问权限(主要提供的是对构造方法使用)
Method 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息。所反映的方法可能是类方法或实例方法(包括抽象方
法)
Field 主要提供对类中的成员变量的访问和使用
Class
Class类也使用了泛型,即是Class
常用的方法常用的方法
getConstructor(Class[] params) 获取公共的(public)的构造方法,并且限定其中的参数个数和类型可以获得不同的公共构造方法
Constructor[] getConstructors() 返回所有的公共(public)的构造方法
getDeclaredConstructor(Class[] params) 获取所有指定的构造方法,但是需要注意的是当获取私有的构造方法的时候需要使用
setAccessible设置访问权限为true才能进行构造,否则出现异常
Constructor[] getDeclaredConstructors() 返所有的构造方法包括public和private,protected修饰的
T newInstance() 返回的是一个调用默认的构造方法(public class_name())实例化的一个Object对象,如果使用泛型那么就返回T类型
的,反之返回的是Object需要强制转换才能使用这个对象调用成员函数和成员变量
Class forName(String class_name) 返回class对象,每一个对都有一个方象法返回Class对象(test.class)
Package getPackage() 返回此类所在的包名(package demo) 当然也可以使用Package.getName()获得包的名字(demo)比如
constructor.getPackage().getName()
int getModifiers() 返回的是类的修饰符的整数 类型(修饰符的类型有public private protected)其中得到整数可以使用Modifier中
toString(int num)得到public,private,protected的类型,比如Modifier.toString(class1.getModifiers())
*Method getMethod(String name, Class<?>... parameterTypes) 返回指定参数的方法Method对象,注意这里仅仅是返回的时公共的
方法(public) 比如:Method method=class1.getMethod("display",new Class[]{int.class})这里的display是方法的名字,有一个参数,类
型为int
Method[] getMethods() 获取所有的公共的方法(public)返回的是一个数组(Method)
Method getDeclaredMethod(String name,Class<?>... parameterTypes)返回所有的指定的参数的方法(public,private,protected,但
是不包括继承的),其中参数可以为null(无参数)
Method[] getDeclaredMethods() 获取所有的方法
Field getField(String name) 指定名字的公共成员变量(public)
Field[] getFields() 获取所有的公共的成员变量
Field getDeclaredField(String name) 获取所有的指定名称的成员变量(public,protected,private),同样在调用私有成员变量的时候需要
先设置访问的权限,field.setAccessible(true)
Field[] getDeclaredFields() 获取所有的成员变量(public,protected,private)
getSuperclass() 返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。
URL getResource(String name) 查找指定名称的资源(图片,文件...)注意这个资源一定要和指定类在一个包中,否则返回null,比如
查找Test类下的airplane.png图片:Test.class.getResource("airplane.png")这里返回的将是绝对路径