Java-反射机制
一、反射机制
定义:
在程序运行的过程中,能够动态加载类的信息
反射机制时在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意的一个对象,都能够调用它的人一一个方法和属性;这种动态获取的信息以及动态调用对象的方法,称为Java的反射机制。
反射的作用:
-
在运行时判断一个对象所属的类
-
在运行时构造一个类的对象
-
在运行时判断一个类所具有的成员变量和方法
-
在运行时调用任意一个对象的方法
反射的原理
类的字节码文件,将xxx.java文件编译后,获得的xxx.class文件,该文件就是字节码文件,字节码文件加载到JVM中,就获得了字节码文件对象。
如何获得字节码文件对象
- Class.forName("类的全路径描述符")
- 类.class
- 对象.getClass()
public class ReflectDemo {
public static void main(String[] args) {
Person person1 = new Person();
Class classz1 = Person.class;
Class classz2 = person1.getClass();
try {
Class classz3 = Class.forName("com.fonxian.base.reflect.Person");
Object obj = classz3.getConstructor().newInstance();
Person person2 = (Person) obj;
person2.learn();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
反射机制API的使用
1、实例化Class类对象
Class<?> class1 = null;
Class<?> class2 = null;
Class<?> class3 = null;
try {
class1 = Class.forName("reflect.TestReflect");
System.out.println(class1.getName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
class2 = new TestReflect().getClass();
System.out.println(class2.getName());
class3 = TestReflect.class;
System.out.println(class3.getName());
2、获取对象父类或实现接口
Class<?> parentClass = class1.getSuperclass();
System.out.println(parentClass.getName());//若没有继承其他类,则返回的是Object类
Class<?> intes[] = class1.getInterfaces();
for(int i=0;i<intes.length;i++){
System.out.println(intes[i].getName());
}
3、实例化类对象
//方法一
try {
class1 = new TestReflect().getClass();
TestReflect reflect = (TestReflect) class1.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
//方法二
Constructor<?> cons[] = class1.getConstructors();
TestReflect tr1 = (TestReflect) cons[1].newInstance("name",20);
4、获取类的属性
Field[] field = class1.getDeclaredFields();
for(int i = 0;i < field.length;i++){
int mo = field[i].getModifiers();
String access = Modifier.toString(mo);//mo为1,返回public,mo为2,返回private
Class<?> type = field[i].getType();
System.out.println(access+" "+type.getName()+" "+field[i].getName()+";");
//private java.lang.String name;
}
关于作者
后端程序员,五年开发经验,从事互联网金融方向。技术公众号「清泉白石」。如果您在阅读文章时有什么疑问或者发现文章的错误,欢迎在公众号里给我留言。