反射机制
通过java语言中的反射机制可以操作字节码文件
反射允许对成员变量,成员方法和构造方法的信息进行编程访问,也就是反射是从类里把成员变量,构造方法,成员方法挨个拿出来
获取class对象
public class D{
public static void main(String[] args) throws ClassNotFoundException {
//1.Class.forName("全类名")
Class clazz1= Class.forName("com.it.Person");
System.out.println(clazz1);
//2.类名.class
Class clazz2= Person.class;
System.out.println(clazz2);
//3.对象.getClass()
Person p = new Person();
Class clazz3= p.getClass();
System.out.println(clazz3);
}
}
获取构造方法
//获取class对象
Class clazz = Class.forName("demo.Student");
/**
* 1.获取单个构造方法,根据不同参数获取不同构造方法
*/
Constructor con = clazz.getDeclaredConstructor(String.class,int.class);
//临时取消权限效验(当为private或protected时使用,不然无法创建对象)
con.setAccessible(true);
//创建对象
Student stu = (Student) con.newInstance("张三",20);
System.out.println(stu)
获取成员变量
//获取class对象
Class clazz = Class.forName("demo.Student");
/**
* 2.获取单个成员变量,根据不同参数获取不同成员变量
*/
Field name = clazz.getDeclaredField("name");
//获取成员变量名字
String name1 = name.getName();
System.out.println(name1);
//获取成员变量类型
int modifiers = name.getModifiers();
System.out.println(modifiers);
name.setAccessible(true);
Student student = new Student("李四");
//通过成员变量获取对象中对应的数据
Object value = name.get(student);
System.out.println(value);
//修改对象里面记录的值
name.set(student,"王五");
System.out.println(student);
获取成员方法
//获取class对象
Class clazz = Class.forName("demo.Student");
/**
* 3.获取成员方法
*/
//获取所有方法对象(包括父类中所有的公共方法)
Method[] methods = clazz.getMethods();
for (Method method : methods) {
System.out.println(method);
}
//获取所有方法对象(不能获取父类的,可以获取本类的私有方法)
Method[] declaredMethods = clazz.getDeclaredMethods();
for (Method declaredMethod : declaredMethods) {
System.out.println(declaredMethod);
}
//获取指定的单一方法
Method eat = clazz.getDeclaredMethod("eat", String.class);
System.out.println(eat);
//获取方法的形参
Parameter[] parameters = eat.getParameters();
for (Parameter parameter : parameters) {
System.out.println(parameter);
}
//运行方法
Student s = new Student();
eat.setAccessible(true);
//eat.invoke(s,"汉堡包");
//当方法有返回值时
Object values = eat.invoke(s,"汉堡包");
System.out.println(values);
对象类
public class Student {
private String name;
private int age;
private String eat(String something){
System.out.println("在吃"+something);
return "好吃";
}
public Student() {
}
public Student(String name) {
this.name = name;
}
private Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}