package bean;
public class Person {
private int age;
private String name;
public Person() {
super();
System.out.println("...Person run...");
}
public Person(String name, int age) {
super();
this.age = age;
this.name = name;
System.out.println("...Person param run..." + this.name + ":"
+ this.age);
}
public void show() {
System.out.println(name + "...show run..." + age);
}
public void method() {
System.out.println("...method run...");
}
public void paramMethod(String str, int num) {
System.out.println("...paramMethod..." + str + ":" + num);
}
public static void staticMethod() {
System.out.println("...staticMethod run...");
}
}
========================分割线========================
/*
* 【获取Class中的字段】
* Class类内有如下特有方法:
*
* (1)public Field getField(String name) throws NoSuchFieldException,SecurityException
* 根据名字获取Class文件中的指定字段,【注意】这个方法可以获取父类的字段
*
* (2)public Field[] getFields() throws SecurityException
* 获取Class文件中所有公共字段
*
* (3)public Field[] getDeclaredFields() throws SecurityException
* 获取Class文件中所有字段,哪怕私有的也可以获取,【注意】这个方法只能获取本类的字段
*/
package demo;
import java.lang.reflect.Field;
public class Demo {
public static void main(String[] args) throws Exception {
getFieldDemo();
}
public static void getFieldDemo() throws Exception {
Class clazz = Class.forName("bean.Person");//这里Person类与前一视频一样,可不重复记录到本子上
// Field field = clazz.getField("age");//对应构造函数(1)
//
// System.out.println(field);//居然抛出NoSuchFieldException,即没有这个字段,因为Person类内age是private
Field field = clazz.getDeclaredField("age");
// System.out.println(field);//private int bean.Person.age
//下面对获取到的字段进行操作,即设置和获取,也就是set和get方法
Object obj = clazz.newInstance();
field.set(obj, 89);
Object o = field.get(obj);
//【注意】一般Person p = new Person,p.age=1;必须指定是p的age对应值为1,所以这里get方法需要指定对象
System.out.println(o);//抛出IllegalAccessException,即无效的访问异常,因为在Person类中age是私有的
/**
* 只需要利用Field父类AccessibleObject中的特有方法取消私有权限即可访问:
* public void setAccessible(boolean flag) throws SecurityException
* 只要在该方法参数内传入true即可取消权限
*
* 所以在39与40行代码之间加上field.setAccessible(true)即可,最后发现输出o的值为0
*
* 这个可以称为【暴力访问】
*/
}
}