假如我们有一个学习的类 里面的东西都是私有的
例如:
public class Student {
private String name;
private int number;
private String address;
public String sex;
public Student(String name, int number, String address, String sex) {
super();
this.name = name;
this.number = number;
this.address = address;
this.sex = sex;
}
public Student() {
super();
}
public void show() {
System.out.println("我是student类的show方法");
}
@Override
public String toString() {
return "Student [name=" + name + ", number=" + number + ", address="
+ address + ", sex=" + sex + "]";
}
}
这样就要用到我们的反射了
例如:
public class Test {
public static void main(String[] args) throws Exception {
Class<?> c = Class.forName("反射.Student");//获取文件字节码文件
Constructor cons = c.getDeclaredConstructor(String.class,int.class,String.class,String.class);//获取所有的构造方法
System.out.println(cons);
cons.setAccessible(true);//暴力访问
Object obj = cons.newInstance("张三",10086,"北京市","男");
System.out.println(obj);
//获取方法属性
Method show = c.getDeclaredMethod("show");
System.out.println(show);
show.invoke(obj);
//修改属性里的值
Field name = c.getDeclaredField("name");
name.setAccessible(true);
name.set(obj, "李四");
System.out.println(obj);
Field number = c.getDeclaredField("number");
number.setAccessible(true);
number.set(obj, 10000);
System.out.println(obj);
}
或者我们也可以用第二种方法
例如:
Class<?> c = Class.forName("反射.Student");
Constructor<?> con = c.getDeclaredConstructor(String.class, int.class,
String.class, String.class);
System.out.println(con);
con.setAccessible(true);
Object obj = con.newInstance("名字", 10086, "北京市", "女");
System.out.println(obj);
// 获得方法的属性
Field me = c.getField("show");
me.setAccessible(true);
System.out.println(me);
//修改属性
Field name = c.getDeclaredField("name");
name.setAccessible(true);
name.set(obj, "张三");
System.out.println(obj);
这样就可以拿到私有方法中的私有属性,私有方法了