什么是反射?
反射(Reflection)是指在程序运行时动态地获取一个类的属性和方法,并对其进行操作的能力。在Java中,我们可以使用Java反射机制来实现该功能。
使用攻略
使用Java反射机制主要包括以下几个步骤:
-
获取一个类的Class对象:Java反射机制通过Class对象来获取一个类的属性和方法信息。获取Class对象的方式包括以下几种:
-
调用对象的getClass()方法,例如:Object obj = new Object(); Class<?> objClass = obj.getClass();
- 使用类名.class获取,例如:Class
intClass = Integer.class; -
使用Class.forName()方法获取,例如:Class<?> stringClass = Class.forName(“java.lang.String”);
-
获取类的构造方法:在获取类的构造方法时,我们可以根据构造方法的参数类型来获取特定的构造方法,如果不指定参数类型,则表示获取默认的无参构造方法。获取构造方法的方式如下:
-
通过Class对象的getConstructor(Class<?>… parameterTypes)方法获取指定参数类型的构造方法,例如:Constructor<?> constructor = stringClass.getConstructor(String.class);
- 通过Class对象的getConstructors()方法获取所有的公共构造方法,例如:Constructor<?>[] constructors = stringClass.getConstructors();
-
通过Class对象的getDeclaredConstructor(Class<?>… parameterTypes)方法获取指定参数类型的构造方法(包括非公共构造方法),例如:Constructor<?> declaredConstructor = stringClass.getDeclaredConstructor(char[].class);
-
获取类的属性:在获取类的属性时,我们可以通过属性名或者属性类型来获取。获取属性的方式如下:
-
通过Class对象的getField(String name)方法获取指定名称的公共属性,例如:Field field1 = stringClass.getField(“CASE_INSENSITIVE_ORDER”);
- 通过Class对象的getDeclaredField(String name)方法获取指定名称的属性(包括非公共属性),例如:Field field2 = stringClass.getDeclaredField(“value”);
- 通过Class对象的getFields()方法获取所有的公共属性,例如:Field[] fields1 = stringClass.getFields();
-
通过Class对象的getDeclaredFields()方法获取所有的属性(包括非公共属性),例如:Field[] fields2 = stringClass.getDeclaredFields();
-
获取类的方法:在获取类的方法时,我们可以通过方法名或者参数类型来获取。获取方法的方式如下:
-
通过Class对象的getMethod(String name, Class<?>… parameterTypes)方法获取指定名称和指定参数类型的公共方法,例如:Method method1 = stringClass.getMethod(“substring”, int.class);
- 通过Class对象的getDeclaredMethod(String name, Class<?>… parameterTypes)方法获取指定名称和指定参数类型的方法(包括非公共方法),例如:Method method2 = stringClass.getDeclaredMethod(“charAt”, int.class);
- 通过Class对象的getMethods()方法获取所有的公共方法,例如:Method[] methods1 = stringClass.getMethods();
-
通过Class对象的getDeclaredMethods()方法获取所有的方法(包括非公共方法),例如:Method[] methods2 = stringClass.getDeclaredMethods();
-
调用方法和设置属性:通过获取到的方法和属性,我们可以对其进行调用和设置操作。调用方法和设置属性的方式如下:
-
通过反射获取到的Method对象的invoke(Object obj, Object… args)方法来调用方法,其中obj表示调用该方法的对象,args表示调用该方法时传入的参数,例如:Object result = method1.invoke(“Hello world”, 6);
- 通过反射获取到的Field对象的set(Object obj, Object value)方法来设置属性,其中obj表示要设置属性的对象,value表示要设置的属性值,例如:field2.setAccessible(true); field2.set(“Hello world”, new char[]{‘J’, ‘a’, ‘v’, ‘a’});
示例说明
示例1 获取类的构造方法
下面的代码演示了如何获取String类的private构造方法:
try {
Class<?> stringClass = Class.forName("java.lang.String");
Constructor<?> constructor = stringClass.getDeclaredConstructor(char[].class);
String str = (String) constructor.newInstance(new char[]{'H', 'i'});
System.out.println(str); // 输出Hi
} catch (Exception e) {
e.printStackTrace();
}
示例2 调用对象的方法
下面的代码演示了如何通过反射获取String类的substring方法,并调用该方法:
try {
Class<?> stringClass = Class.forName("java.lang.String");
Method method = stringClass.getMethod("substring", int.class);
Object result = method.invoke("Hello world", 6);
System.out.println(result); // 输出world
} catch (Exception e) {
e.printStackTrace();
}
以上就是Java反射机制的详细讲解和使用攻略,希望对你有所帮助。