认识反射首先要理解class对象。jvm将我们的.class文件读入内存中,并自动创建一个与之对应的class对象。一个.class只会创建一个class对象。如下图,从其他地方copy来的:
创建class对象的方法有以下三种。
//反射就是把java类中的各种成分映射成一个个的Java对象
System.out.println(Rstudent.class == Class.forName("com.allen.trainning.reflect.Rstudent"));
System.out.println(Rstudent.class == new Rstudent("").getClass());
执行结果:
具体实例,直接上代码:
com.allen.trainning.reflect.Rstudent 用来被反射调用的类。
package com.allen.trainning.reflect;
import java.math.BigDecimal;
public class Rstudent {
public String name = "Bill";
public BigDecimal money = new BigDecimal("10000000");
private String accountNumber = "999908998600";
public Rstudent() {
}
public Rstudent(String name) {
this.name = name;
}
private Rstudent(BigDecimal money) {
this.money = money;
}
public String toString() {
return name + " " + money + " " + accountNumber;
}
public void printName() {
System.out.println("name is" + name);
}
private void setAccountNumber(String accountNumber) {
this.accountNumber = accountNumber;
System.out.println("accountNumber is" + accountNumber);
}
private void printAccountNumber() {
System.out.println("accountNumber is" + accountNumber);
}
}
com.allen.trainning.reflect.ReflectConstructorMain.java 对(包括私有)构造方法的获取和调用。
package com.allen.trainning.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.math.BigDecimal;
public class ReflectConstructorMain {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException,
IllegalAccessException, InvocationTargetException, InstantiationException {
//反射就是把java类中的各种成分映射成一个个的Java对象
System.out.println(Rstudent.class == Class.forName("com.allen.trainning.reflect.Rstudent"));
System.out.println(Rstudent.class == new Rstudent("").getClass());
System.out.println("=====================================================================");
//所有"公有的"构造方法
Class classObject = Class.forName("com.allen.trainning.reflect.Rstudent");
Constructor[] constructors = classObject.getConstructors();
for (Constructor constructor : constructors) {
System.out.println("public only -- " + constructor);
}
System.out.println("=====================================================================");
//获取所有的构造方法(包括私有)
Constructor[] pconstructors = classObject.getDeclaredConstructors();
for (Constructor constructor : pconstructors) {
System.out.println("all constructors -- " + constructor);
}
System.out.println("=====================================================================");
//获取单个公的方法,并调用
Constructor sconstructor = classObject.getConstructor(String.class);
Rstudent student = (Rstudent) sconstructor.newInstance("Allen");
System.out.println("got student -- " + student.name);
System.out.println("=====================================================================");
//获取单个的私有构造方法,并调用
Constructor psconstructor = classObject.getDeclaredConstructor(BigDecimal.class);
psconstructor.setAccessible(true);
Rstudent pstudent = (Rstudent) psconstructor.newInstance(new BigDecimal("90000000.989"));
System.out.println("got money -- " + pstudent.money);
}
}
执行结果:
com.allen.trainning.reflect.ReflectPropertiesMain.java 对(包括私有)属性的获取和设置值。
package com.allen.trainning.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
public class ReflectPropertiesMain {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException,
IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
//所有"公有的"属性
Class classObject = Class.forName("com.allen.trainning.reflect.Rstudent");
Field[] fields = classObject.getFields();
for (Field field : fields) {
System.out.println(field.getName());
}
System.out.println("=====================================================================");
//所有"公有的"属性
Field[] pfields = classObject.getDeclaredFields();
for (Field field : pfields) {
System.out.println(field.getName());
}
System.out.println("=====================================================================");
//获取,设置"非私有的"属性
Rstudent student = (Rstudent) classObject.getConstructor(null).newInstance();
Field name = classObject.getField("name");
System.out.println(name.get(student));
name.set(student, "little Bill");
System.out.println(name.get(student));
System.out.println("=====================================================================");
//获取,设置"私有的"属性
Field accountNumber = classObject.getDeclaredField("accountNumber");
accountNumber.setAccessible(true);
System.out.println(accountNumber.get(student));
accountNumber.set(student, "888888888888");
System.out.println(accountNumber.get(student));
System.out.println("=====================================================================");
}
}
执行结果:
com.allen.trainning.reflect.ReflectMethodMain.java 对(包括私有)方法的获取和调用。
package com.allen.trainning.reflect;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ReflectMethodMain {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException,
IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
//所有"公有的"方法,包括父类的,父接口的
Class classObject = Class.forName("com.allen.trainning.reflect.Rstudent");
Method[] methods = classObject.getMethods();
for (Method method : methods) {
System.out.println(method);
}
System.out.println("=====================================================================");
//所有"本类"方法,包括私有的
Method[] pmethods = classObject.getDeclaredMethods();
for (Method method : pmethods) {
System.out.println(method);
}
System.out.println("=====================================================================");
//获取,调用所有类型的方法
Rstudent student = (Rstudent) classObject.getConstructor(null).newInstance(null);
Method nameMethod = classObject.getMethod("printName", null);
nameMethod.invoke(student, null);
Method printAcctMethod = classObject.getDeclaredMethod("printAccountNumber", null);
printAcctMethod.setAccessible(true);
printAcctMethod.invoke(student, null);
Method setAcctMethod = classObject.getDeclaredMethod("setAccountNumber", String.class);
setAcctMethod.setAccessible(true);
setAcctMethod.invoke(student, "999999999999");
printAcctMethod.invoke(student, null);
System.out.println("=====================================================================");
}
}
执行结果:
参考: https://blog.csdn.net/lwl20140904/article/details/80163880