Java反射机制基础详解
Java反射机制是指在运行状态中,对于任意一个类都能够知道这个类的所有属性和方法,在运行时刻可以调用任意一个方法或者访问任意一个属性,这种方法称之为反射机制。
反射机制主要涉及三个类:Class,Constructor和Method。
Class类
在Java反射机制中,Class是反射机制的根源,它代表了被加载进内存中的类。Class中提供了获取类属性、方法、构造方法等的一系列方法。
获取Class对象的方式
1.通过对象获取
例如,使用以下代码获取String类的Class对象:
String str = "hello world";
Class<? extends String> clazz = str.getClass();
2.通过类获取
例如,使用以下代码获取String类的Class对象:
Class<String> clazz = String.class;
3.通过Class.forName()方法获取
例如,使用以下代码获取String类的Class对象:
Class<?> clazz = Class.forName("java.lang.String");
获取类的属性
以下代码可以获取指定类的所有属性:
Field[] fields = clazz.getDeclaredFields();
获取类的方法
以下代码可以获取指定类的所有方法:
Method[] methods = clazz.getDeclaredMethods();
获取类的构造方法
以下代码可以获取指定类的所有构造方法:
Constructor<?>[] constructors = clazz.getDeclaredConstructors();
Constructor类
Constructor是反射机制中的一个类,它用于描述类的构造方法,Constructor对象用于创建新的类实例。
创建新的类实例
以下代码可以使用Constructor类的newInstance()方法创建一个新的类实例:
Constructor<?> constructor = clazz.getDeclaredConstructor();
Object instance = constructor.newInstance();
Method类
Method是反射机制中的一个类,它用于描述类的方法。
调用指定的方法
以下代码可以使用Method类的invoke()方法调用指定的方法:
Method method = clazz.getDeclaredMethod("methodName", paramTypes);
Object result = method.invoke(instance, args);
其中,methodName是方法名,paramTypes是方法参数类型数组,instance是该方法所在类的实例,args是参数数组。如果该方法是静态方法,则instance可以设为null。
示例
示例一
public class Person {
private String name;
private Integer age;
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
}
public class Main {
public static void main(String[] args) throws Exception {
Class<?> clazz = Person.class;
Constructor<?> constructor = clazz.getDeclaredConstructor(String.class, Integer.class);
Object person = constructor.newInstance("张三", 20);
Method getName = clazz.getDeclaredMethod("getName");
String name = (String)getName.invoke(person);
System.out.println("姓名:" + name);
Method getAge = clazz.getDeclaredMethod("getAge");
Integer age = (Integer)getAge.invoke(person);
System.out.println("年龄:" + age);
}
}
运行结果:
姓名:张三
年龄:20
示例二
public class Math {
public static int add(int a, int b) {
return a + b;
}
public static int sub(int a, int b) {
return a - b;
}
}
public class Main {
public static void main(String[] args) throws Exception {
Class<?> clazz = Math.class;
Method add = clazz.getDeclaredMethod("add", int.class, int.class);
int result1 = (int)add.invoke(null, 1, 2);
System.out.println("1 + 2 = " + result1);
Method sub = clazz.getDeclaredMethod("sub", int.class, int.class);
int result2 = (int)sub.invoke(null, 5, 3);
System.out.println("5 - 3 = " + result2);
}
}
运行结果:
1 + 2 = 3
5 - 3 = 2
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java反射机制基础详解 - Python技术站