java不是动态语言,但他有一个动态相关机制:Reflection反射。在运行状态中:
1)对于任意一个实体类,可以获取它的所有属性和方法;
2)对于任意一个对象,可以调用它的方法和属性。
总结来说,动态获取信息以及动态调用对象方法的功能称为java反射机制。
正常情况下这样获取对象:
使用import导入所在包;
明确的使用类名称或接口名称定义对象;
通过关键字new进行类对象的实例化;
反射直接利用Object与反射机制的混合调用类中的方法,不需要明确类型的对象,所有的对象使用Object表示。
举例:通过一个字节码文件(.class) 怎样知道这个字节码文件中有什么方法和属性?
方法就是反射。
在JDK中提供了Class对象来保存类的信息。
反射的第一步就是得到Class对象。
在JDK中提供了如下方式得到Class对象:
public static void main(String[] args) {
//方法一Class.forName("路径");:
try {
Class.forName("Test1"); //必须是该类的完整路径
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//方法二(类名.class,推荐使用,代码安全):
Class clazz=Test1.class;
//方法三(调用对象的方法):
Test1 test1=new Test1();
test1.getClass();
}
此方法需要有2个条件:
第一,forName中的字符串必须是全限定名;
第二,这个Class类必须在classpath的路径下面,因为该方法会抛出
ClassNotFoundException 的异常。
获取到这个Class对象之后,就可以得到类的各种信息。
获取Class对象
通过反射生成对象
获取方法
getDeclaredMethods()方法返回类或者接口声明的所有方法,但不包括集成的方法。
getMethods()方法返回某个类的所有公有(public)方法。
getmethod()方法返回特定的方法,第一个参数为方法名,后面的参数为方法对应的Class对象。
获取构造器信息
获取类的成员变量信息
getFiled:访问公有的成员变量。
getDeclareField:所有已声明的成员变量。但不能得到其父类的成员变量。
getFileds和getDeclaredFields
调用方法
invoke()方法
下面这篇文章对反射的内容讲的十分详细透彻,推荐阅读,也留存备用:
https://blog.csdn.net/u012562943/article/details/54405941
https://blog.csdn.net/lijizhi19950123/article/details/78141792