Java-反射
1 概念
1、Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。
2、加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,我们形象的称之为:反射
2 反射相关API
java.lang.Class:代表一个类
java.lang.reflect.Method:代表类的方法
java.lang.reflect.Field:代表类的成员变量
java.lang.reflect.Constructor:代表类的构造器
3 获取class的四种方法
// 已知具体的类
Class myClass = String.class;
System.out.println(myClass);
// 已知某个类的实例
Class myClass1 = "word".getClass();
System.out.println(myClass1);
// 已知一个类的全类名
Class myClass2 = Class.forName("java.lang.String");
System.out.println(myClass2);
// 从类加载器获取
ClassLoader classLoader = TestReflection.class.getClassLoader();
Class myClass3 = classLoader.loadClass("java.lang.String");
System.out.println(myClass3);
4 反射的应用
反射可以获取如下内容:
Field、Method、Constructor、Superclass、Interface、Annotation
Class myClass = Class.forName("java.lang.String");
System.out.println("获取实现的全部接口");
Class[] classes = myClass.getInterfaces();
for (Class class1 : classes) {
System.out.println(class1);
}
System.out.println("获取所继承的父类");
Class cl = myClass.getSuperclass();
System.out.println(cl);
System.out.println("获取全部的构造器");
Constructor[] constructor = myClass.getConstructors();
for (Constructor constructor2 : constructor) {
System.out.println(constructor2);
}
System.out.println("获取全部的方法");
Method[] methods = myClass.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method);
}
System.out.println("获取全部的Field");
Field[] fields = myClass.getDeclaredFields();
for (Field field : fields) {
System.out.println(field);
}
System.out.println("获取Annotation");
Annotation[] annotations = myClass.getDeclaredAnnotations();
for (Annotation annotation : annotations) {
System.out.println(annotation);
}
System.out.println("获取泛型");
Type type = myClass.getGenericSuperclass();
System.out.println(type);
System.out.println("获取类所在的包");
Package package1 = myClass.getPackage();
System.out.println(package1);