获取私有属性
@Test
public void getFie2() throws Exception {
Class<?> clazz = Person.class;
//获取指定的私有属性,注意要传入指定的参数名,而且要抛出异常
Field field = clazz.getDeclaredField("name");
System.out.println(field);
//通过刚刚获取到的私有属性对象,查看他的类型
System.out.println(field.getType());//class java.lang.String
System.out.println(field.getType().getName());//java.lang.String
/*设置属性值*/
//需要指定到底是给哪个对象的name属性设置值
Object obj = clazz.newInstance();
//暴力反射,需要设置私有可见的权限
field.setAccessible(true);
//利用反射给刚刚获取到的字段对象设置属性值
/*field就是我们刚刚获取到的name属性
* set(m,n)---m是给哪个对象的name属性设置值,n是具体设置的值是什么*/
field.set(obj, "海绵宝宝");
//打印查看刚刚设置的属性值
//field.get(m)---field表示的就是name属性,m代表刚刚给哪个对象设置值
System.out.println(field.get(obj));
}
@Test
public void getFie() throws Exception{
Class<?> c = Person.class;
Field f = c.getDeclaredField("age");
Object o = c.newInstance();
f.setAccessible(true);
f.set(o, 18);
System.out.println(f.get(o));
}
获取并执行私有方法
@Test
public void getFunction2() throws Exception {
Class<?> clazz = Person.class;
//通过字节码对象获取对应的私有方法对象method,代表的就是save(int,String)这个方法
Method method = clazz.getDeclaredMethod("save", int.class,String.class);
//没有对象先通过反射创建对象
Object p1 = clazz.newInstance();
method.setAccessible(true);
/*invoke(o,x,y,z...),表示通过反射技术给队友的对象执行指定的方法
* o:指的就是对应的对象
* x,y,z....:执行对应方法时需要传入的参数*/
//通过方法对象调用invoke()执行私有方法
method.invoke(p1, 666,"哈哈哈");
}