当我们需要在程序运行时获取类型信息,然后在不知道具体类型的情况下执行某些操作,这时就需要使用Java反射。
Java反射机制提供了在运行时获取类的详细信息(包括方法、构造函数、字段等)并动态操作他们的能力。本文将深入讲解Java反射机制的使用。
获取Class对象
在Java中获取类的Class对象有三种常用的方式:调用Object类中的getClass()方法、类名.class、Class.forName()方法。
//使用getClass()方法获取Class对象
String str = "hello world";
Class strClass = str.getClass();
System.out.println("strClass == String.class - " + (strClass.equals(String.class)));
//使用类名.class获取Class对象
Class intClass = int.class;
System.out.println("intClass.getName() - " + intClass.getName());
//使用Class.forName()方法获取Class对象
String className = "java.util.ArrayList";
Class arrayListClass = Class.forName(className);
System.out.println("arrayListClass == ArrayList.class - " + (arrayListClass.equals(ArrayList.class)));
获取类的构造函数
获取类中定义的构造函数需要使用Class对象中的getConstructors()或getConstructor(Class… parameterTypes)方法。
//获取String类中的无参数构造方法
Constructor stringConstructor = String.class.getConstructor(null);
String str = (String) stringConstructor.newInstance(null);
System.out.println("str.isEmpty() - " + str.isEmpty());
//获取ArrayList类中的有参数构造方法
Constructor arrayListConstructor = ArrayList.class.getConstructor(int.class);
ArrayList arrayList = (ArrayList) arrayListConstructor.newInstance(30);
System.out.println("arrayList.size() - " + arrayList.size());
获取类的方法
获取类中定义的方法需要使用Class对象中的getMethods()或getMethod(String name, Class… parameterTypes)方法。
//获取String类的length()方法
Method stringLengthMethod = String.class.getMethod("length", null);
String str = "hello world";
int length = (int) stringLengthMethod.invoke(str, null);
System.out.println("String length is - " + length);
//获取ArrayList类的add()方法
Method arrayListAddMethod = ArrayList.class.getMethod("add", Object.class);
ArrayList arrayList = new ArrayList();
arrayListAddMethod.invoke(arrayList, "hello");
System.out.println("ArrayList size is - " + arrayList.size());
获取类的字段
获取类中定义的字段需要使用Class对象中的getFields()或getField(String name)方法。
//获取String类中的private final字段value
Field stringValueField = String.class.getDeclaredField("value");
stringValueField.setAccessible(true);
String str = "hello world";
char[] value = (char[]) stringValueField.get(str);
System.out.println("String value is - " + Arrays.toString(value));
//获取ArrayList类中的private字段elementData
Field arrayListElementDataField = ArrayList.class.getDeclaredField("elementData");
arrayListElementDataField.setAccessible(true);
ArrayList arrayList = new ArrayList();
Object[] elementData = (Object[]) arrayListElementDataField.get(arrayList);
System.out.println("ArrayList elementData is - " + Arrays.toString(elementData));
以上就是Java反射机制的基本使用攻略,希望能对你有所帮助。