获取类的class对象
Class c1 = Class.forName("reflect.Student");
Class c2 = Student.class;
Class c3 = new Student().getClass();
System.out.println(c1);
System.out.println(c2);
System.out.println(c3);
System.out.println((c1 == c2));
System.out.println((c1 == c3));
获取构造方法
System.out.println("-------------------获取到的构造方法-----------------");
Constructor[] declaredConstructors = c1.getDeclaredConstructors();
for (Constructor con : declaredConstructors) {
System.out.println("构造方法名:" + con.getName() + " ,参数个数:" + con.getParameterCount());
}
System.out.println("-------------------222222-----------------");
Constructor constructor = c1.getConstructor(String.class, int.class, String.class);
System.out.println("构造方法名:" + constructor.getName() + " ,参数个数:" + constructor.getParameterCount());
System.out.println("-------------------33333-----------------");
Student xiaoming = (Student) constructor.newInstance("小明", 20, "苏州");
System.out.println(xiaoming);
获取成员变量
System.out.println("-------------------获取到到成员变量-----------------");
Field[] fields = c1.getDeclaredFields();
for (Field field : fields) {
System.out.println(field.getName() + " " + field.getType());
}
System.out.println("-------------------5555555-----------------");
Field address = c1.getField("address");
System.out.println(address.getName() + " " + address.getType());
System.out.println("-------------------6666666-----------------");
address.set(xiaoming, "南京");
System.out.println(xiaoming);
获取方法
System.out.println("-------------------获取到的方法-----------------");
Method[] methods = c1.getDeclaredMethods();
for (Method method : methods) {
System.out.println("方法名:" + method.getName() + ",方法参数个数: " + method.getParameterCount());
}
System.out.println("-------------------8888888-----------------");
Method study = c1.getMethod("study", String.class);
study.invoke(xiaoming, "英语");
System.out.println("-------------------999999-----------------");
Method write = c1.getDeclaredMethod("write");
write.setAccessible(true);
write.invoke(xiaoming);
绕过编译器,在运行时大显身手
System.out.println("针对arraylist的操作");
ArrayList<Integer> list = new ArrayList<>();
list.add(2);
list.add(3);
ArrayList<String> list2 = new ArrayList<>();
System.out.println(list.getClass() == list2.getClass());
Method add = list.getClass().getDeclaredMethod("add", Object.class);
add.invoke(list, "小明");
add.invoke(list, xiaoming);
System.out.println(list);
完整代码
package reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
public class Demo {
public static void main(String[] args) throws Exception {
Class c1 = Class.forName("reflect.Student");
Class c2 = Student.class;
Class c3 = new Student().getClass();
System.out.println(c1);
System.out.println(c2);
System.out.println(c3);
System.out.println((c1 == c2));
System.out.println((c1 == c3));
System.out.println("-------------------获取到的构造方法-----------------");
Constructor[] declaredConstructors = c1.getDeclaredConstructors();
for (Constructor con : declaredConstructors) {
System.out.println("构造方法名:" + con.getName() + " ,参数个数:" + con.getParameterCount());
}
System.out.println("-------------------222222-----------------");
Constructor constructor = c1.getConstructor(String.class, int.class, String.class);
System.out.println("构造方法名:" + constructor.getName() + " ,参数个数:" + constructor.getParameterCount());
System.out.println("-------------------33333-----------------");
Student xiaoming = (Student) constructor.newInstance("小明", 20, "苏州");
System.out.println(xiaoming);
System.out.println("-------------------获取到到成员变量-----------------");
Field[] fields = c1.getDeclaredFields();
for (Field field : fields) {
System.out.println(field.getName() + " " + field.getType());
}
System.out.println("-------------------5555555-----------------");
Field address = c1.getField("address");
System.out.println(address.getName() + " " + address.getType());
System.out.println("-------------------6666666-----------------");
address.set(xiaoming, "南京");
System.out.println(xiaoming);
System.out.println("-------------------获取到的方法-----------------");
Method[] methods = c1.getDeclaredMethods();
for (Method method : methods) {
System.out.println("方法名:" + method.getName() + ",方法参数个数: " + method.getParameterCount());
}
System.out.println("-------------------8888888-----------------");
Method study = c1.getMethod("study", String.class);
study.invoke(xiaoming, "英语");
System.out.println("-------------------999999-----------------");
Method write = c1.getDeclaredMethod("write");
write.setAccessible(true);
write.invoke(xiaoming);
System.out.println("针对arraylist的操作");
ArrayList<Integer> list = new ArrayList<>();
list.add(2);
list.add(3);
ArrayList<String> list2 = new ArrayList<>();
System.out.println(list.getClass() == list2.getClass());
Method add = list.getClass().getDeclaredMethod("add", Object.class);
add.invoke(list, "小明");
add.invoke(list, xiaoming);
System.out.println(list);
}
}
package reflect;
import lombok.Data;
import lombok.extern.java.Log;
@Log
@Data
public class Student {
private String name;
private int age;
public String address;
public Student() {
}
public Student(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
public void study(String subject) {
System.out.println(name + "在学习" + subject + "~~~");
}
private void write() {
System.out.println(name + "在写字~~~");
}
}