使用反射技术获取成员变量对象并使用
反射的第一步是先得到类对象,然后从类对象中获取类的成分对象
Class类中用于获取成员变量的方法
Field[] getFields() 返回所有成员变量对象的数组(只能拿public修饰的)
Field[] getDeclaredFields() 返回所有成员变量对象的数组,存在就能拿到
Field getField(String name) 返回单个成员变量对象(只能拿Public修饰的)
Field getDeclaredField(String name) 返回成员变量对象,存在就能拿到
使用反射技术获取成员变量并使用
获取成员变量的作用依然是在某个对象中取值,赋值
Field类中用于取值、赋值的方法
void set(Objet obj,Object value) 赋值
void get(Objet obj) 获取值
import java.lang.reflect.Field;
public class Test {
public static void main(String[] args) throws Exception {
Class c=Student.class; //先获取类对象
Field reflectage=c.getDeclaredField("age");
//创建一个学生对象
Student s1=new Student();
reflectage.setAccessible(true);//暴力反射访问私有方法
reflectage.set(s1, 18);//赋值
System.out.println(s1);
int age=reflectage.getInt(s1);
System.out.println(age);
}
}
使用反射获取方法对象并使用
反射的第一步是先得到类对象,然后从类对象中后去类的成分对象
Class类中获取成员方法的方法
Method[] getMethods() 返回所有成员方法对象的数组(只能返回为public修饰的)
Method[] getDeclaredMethod() 返回所有成员方法对象的数组
Method getMethod(String name,Class<?> parameterTypes) 返回单个成员方法对象(只能为public修饰的)
Method getDeclaredMethod(String name,Class<?> parameterTypes) 返回单个成员方法对象
Method类中用于触发执行的方法
Object invoke (Object obj,Object args) 运行方法
参数1:用obj对象调用该方法
参数2:调用方法的传递的参数(如果没有就不写)返回值:方法的返回值(如果没有就不写)
学生对象
public class Student {
private String name;
private int age;
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Student() {
super();
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the age
*/
public int getAge() {
return age;
}
/**
* @param age the age to set
*/
public void setAge(int age) {
this.age = age;
}
private void start() {
System.out.println(name+"正在上课");
}
public String eat(String food) {
System.out.println(name+"正在吃"+food);
return name+"吃了"+food;
}
}
package 反射获取成员变量对象;
import java.lang.reflect.Method;
public class Test2 {
public static void main(String[] args) throws Exception{
//获取类对象
Class c=Student.class;
//创建一个学生对象
Student s1=new Student("张三",18);
//获取方法对象(无参数,无法返回值)
Method m1=c.getDeclaredMethod("start");//方法名
m1.setAccessible(true); //访问私有方法开启暴力反射
m1.invoke(s1);
System.out.println("--------------");
//获取方法对象(有参有返回值)
Method m2=c.getDeclaredMethod("eat", String.class);
Object msg=m2.invoke(s1, "苹果");
System.out.println(msg);
}
}