简单使用
Apple.java
public class Apple{
private String name;
private float price;
public Apple() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
@Override
public String toString(){
return String.format("Name = %s ; Price = %s",name, price);
}
}
正常创建对象并调用方法
// 正常调用方法
Apple apple = new Apple();
apple.setName("苹果");
apple.setPrice(10);
System.out.println(apple.toString());
Name = 苹果 ; Price = 10.0
获取类的 Class 对象实例
使用Class.forName(),传入class包路径
Class<?> clazz = (Class<?>) Class.forName("study.Apple");
根据Class对象获取实例
Apple apple2 = (Apple) clazz.newInstance();
根据 Class 对象实例获取 Constructor 对象
Constructor[] constructors = clazz.getConstructors();
使用 Constructor 对象的 newInstance 方法获取反射类对象
// Apple有一个无参构造函数
Apple apple3 = (Apple) constructors[0].newInstance();
通过反射调用方法
获取方法的 Method 对象
// 参数[方法名,<paramClasses>]
Method setP = clazz.getMethod("setPrice", float.class);
利用 invoke 方法调用方法
// 反射调用方法
Method setP = clazz.getMethod("setPrice", float.class);
// 反射修改价格
setP.invoke(apple2,8);
Method method = clazz.getMethod("toString");
// 有返回值
String out = (String) method.invoke(apple2);
System.out.println(out);
反射常用API
获取反射中的Class对象
在反射中,要获取一个类或调用一个类的方法,我们首先需要获取到该类的 Class 对象。
在 Java API 中,获取 Class 类对象有三种方法:
第一种,使用 Class.forName 静态方法。当你知道该类的全路径名时,你可以使用该方法获取 Class 类对象。
Class clazz = Class.forName("study.Apple");
第二种,使用 .class 方法。
// 适用于编译前知道类
Class<Apple> clzz = Apple.class;
第三种,使用类对象的 getClass() 方法。
Class<?> clzz = apple.getClass();
通过反射创建类对象
通过反射创建类对象主要有两种方式:通过 Class 对象的 newInstance() 方法、通过 Constructor 对象的 newInstance() 方法。
-
第一种:通过 Class 对象的 newInstance() 方法。
-
第二种:通过 Constructor 对象的 newInstance() 方法
// 通过Class获取
Apple apple = clazz.newInstance();
// Apple有一个无参构造函数
Apple apple3 = (Apple) constructors[0].newInstance();
通过反射获取类属性、方法、构造器
我们通过 Class 对象的 getFields() 方法可以获取 Class 类的属性,但无法获取私有属性。
Class clazz = Apple.class;
// 获取属性
Field[] fields = clazz.getFields();
for (Field field : fields) {
System.out.println(field.getName());
}
// 获取方法
Method setP = clazz.getMethod("setPrice", float.class);
// 获取所有构造器
Constructor[] constructors = clazz.getConstructors();