反射获取成员变量并使用
获取所有的成员变量:
getFields():获取公共的所有成员变量
getDeclaredFields():获取所有成员变量
学生类:
package JavaAPI.FanShe.Test1.ch01;
public class Student {
private String name;
private int age;
public String sex;
Integer idNum;
}
测试类:
package JavaAPI.FanShe.Test1.ch02;
import java.lang.reflect.Field;
/**
* 反射获取对象的变量
*/
public class Test3 {
public static void main(String[] args) throws Exception {
Class<?> c = Class.forName("JavaAPI.FanShe.Test1.ch01.Student");
/**
* 获取公共的所有成员变量
*/
System.out.println("获取到的所有的公共成员变量为:");
Field[] fields = c.getFields();
for (Field field:fields)
System.out.println(field);
System.out.println("-------");
/**
* 获取所有成员变量
*/
System.out.println("获取到的成员变量为:");
Field[] fields1 = c.getDeclaredFields();
for (Field field:fields1)
System.out.println(field);
System.out.println("-------");
}
}
获取单个的成员变量:
getField():获取公共的单个成员变量
getDeclaredField():获取单个成员变量
package JavaAPI.FanShe.Test1.ch02;
import java.lang.reflect.Field;
/**
* 反射获取对象的变量
*/
public class Test3 {
public static void main(String[] args) throws Exception {
Class<?> c = Class.forName("JavaAPI.FanShe.Test1.ch01.Student");
/**
* 获取到的单个公共变量
*/
System.out.println("获取到的单个公共变量为:");
Field field = c.getField("sex");
System.out.println(field);
System.out.println("-------");
/**
* 获取到的单个私有变量
*/
System.out.println("获取到的单个私有变量为:");
Field name = c.getDeclaredField("name");
System.out.println(name);
System.out.println("-------");
}
}
获取单个成员对象并赋值:
获取公共成员变量赋值 set
System.out.println("获取到的单个公共变量为:");
Field field = c.getField("sex");
System.out.println(field);
Constructor<?> s1 = c.getConstructor(); //获取公共无参构造方法
Object o1 = s1.newInstance(); //创建无参方法构造对象
field.set(o1,"男"); //给o1中的sex属性赋值
System.out.println(o1);
System.out.println("-------");
获取成员变量赋值Field下的setAccessible(true); 方法
/**
* 获取到的单个私有变量
*/
System.out.println("获取到的单个私有变量为:");
Field name = c.getDeclaredField("name");
System.out.println(name);
Constructor<?> s2 = c.getDeclaredConstructor(); //获取公共无参构造方法
name.setAccessible(true); //暴力赋值
Object o = s2.newInstance(); //创建无参方法构造对象
name.set(o,"小王"); //给o1中的name属性赋值
System.out.println(o);
System.out.println("-------");
反射获取成员方法
反射获取所有的成员方法
getMethods():获取到的所有方法(不包括私有的,包括所继承的)
getDeclaredMethods():所有的本类的方法(包括私有的)
学生类:
package JavaAPI.FanShe.Test1.ch01;
import java.util.Objects;
public class Student {
private String name;
private int age;
public String sex;
Integer idNum;
public Student() {
}
private Student(String name) {
this.name = name;
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age && Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
public void show1() {
System.out.println("public----show1");
}
private void show2() {
System.out.println("private----show2");
}
public String show3(String s) {
System.out.println("public----String----show3");
System.out.println("参数为"+s);
return s;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
", idNum=" + idNum +
'}';
}
}
测试类:
package JavaAPI.FanShe.Test1.ch02;
import java.lang.reflect.Method;
/**
* 反射获取成员方法
*/
public class Test4 {
public static void main(String[] args) throws Exception {
Class<?> c = Class.forName("JavaAPI.FanShe.Test1.ch01.Student");
/**
* 返回所有的方法包括所继承的和实现的
*/
System.out.println("获取到的所有方法(不包括私有的)");
Method[] methods = c.getMethods();
for (Method method:methods)
System.out.println(method);
System.out.println("----------");
/**
* 返回所有的私有方法包括所继承的和实现的
*/
System.out.println("获取到的所有私有方法");
Method[] methods1 = c.getDeclaredMethods();
for (Method method:methods1)
System.out.println(method);
System.out.println("----------");
}
}
反射获取单个的成员方法并使用
获取单个公共对象的方法getMethod(方法名称,参数);
获取单个公共的方法getDeclaredMethod(方法名称,参数);
调用方法invoke(o,参数);
无参方法:
示例:
/**
* 反射获取到的单个方法
*/
System.out.println("获取无参,public,无返回值的方法show1");
Method m = c.getMethod("show1"); //反射获取单个方法
Constructor<?> s1 = c.getConstructor(); //获取对象
Object o = s1.newInstance(); //无参构造创建对象
m.invoke(o);
带参有返回值:
/**
* 反射获取到的单个带参方法
*/
System.out.println("获取带参,public,有返回值的方法show3");
Method show3 = c.getMethod("show3", String.class);//反射获取单个方法
Constructor<?> s3 = c.getConstructor(); //获取对象
Object o3 = s3.newInstance(); //无参构造创建对象
Object fanhui = show3.invoke(o3, "show3"); //获取返回值
System.out.println(fanhui);
私有的方法:
/**
* 反射获取到的单个私有方法
*/
System.out.println("获取无参,private,无返回值的方法show2");
Method m2 = c.getDeclaredMethod("show2"); //反射获取单个方法
m2.setAccessible(true);
Constructor<?> s2 = c.getConstructor(); //获取对象
Object o2 = s2.newInstance(); //无参构造创建对象
m2.invoke(o2);