反射
什么是反射
运行时打开和检查 .class 文件,即通过.class 去拿到真正java 类中属性或者方法,然后就可以调用那些属性或者方法去做一些事情。
即:反射就是把Java类中的各种成分映射成相应的Java类,一个类中的每个成员都可以用相应的反射API类的一个实例表示(Field、Method、Contructor、Package)。
使用反射
1.先写一个User 类
package com.test.annotation;
public class User {
private String name ; //私有 后面有区别
public int age ;//公有,
public User(String name,int age){
this.name = name ;
this.age = age ;
}
public void eat(String eat){
System.out.println(eat+"好吃");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2. 反射到User 类
拿到类对象(有三种方式)
//第一种方法
Class clazz1 = User.class;
// 第二种方法
Class clazz2 = Class.forName("com.test.annotation.User");
// 第三种方法
User user = new User("lisi",10);
Class clazz =user.getClass();
拿到成员变量
//getField只能取出public
Field fieldAge = clazz.getField("age");
Field fieldName = clazz.getField("name");
//getDeclaredField可以取出private
Field fieldName = clazz.getDeclaredField("name");
//允许对对象进行操作(暴力反射)
fieldName.setAccessible(true);
String name = (String) fieldName.get(user);
int age = fieldAge.getInt(user);
System.out.println("name:"+name+",age:"+age);
修改对象中变量的值
fieldName.set(user, "lisi");
fieldAge.set(user, 20);
System.out.println("name:"+user.getName()+",age:"+user.getAge());
拿到对象中的方法
//取出所有方法
Method[] methods = clazz.getMethods();
for(Method method : methods){
System.out.println(method.getName());
}
//取到eat方法 1方法名称 2方法参数类型
Method method = clazz.getMethod("eat",String.class);
//调用该方法(在user对象中调用该方法,传入"面条"对象)
method.invoke(user, "面条");