package reflect_2020_09_29;

import java.lang.reflect.*;

/**
* 学习通过反射访问 成员变量 的方法
*
* 1.要使用java.lang.reflact.File这个包
*
* Class c=Class.getName("类名");
* 语法:File []f=c.getFile();//返回所有的共有属性
*
* 2.常用的方法
*
* 1.getModifiers();//成员变量的修饰符
* 2.getName();//成员变量的名字
* 3.getType();//成员变量的申明类型
*
* 3.获取成员变量名字
*
* 1.获取所有的成员变量 class.getFiles();
* 2.获取指定的成员变量 class.getFile(String name);//参数是变量的名字
*
* 3.获取包括私有的成员变量 class.getDeclaredFiles();
* 4.获取指定的包括私有的成员变量 class.getDeclaredFile(String name);
*
* 4.获取变量的值
*
* 第一步:首先判断是不是私有的,如果是私有的,加一行代码
* setAccessible(true);//获取权限
*
* 第二步:获取这个值
*
* 1.getBoolean(Object o);2.getByte(Object o);3.getChar(Object o);4.getDouble(Object o);
* 5.getInt(Object o);6.getLong(Object o);7.getShort(Object o);
*
* 第三步:修改这个值
*
*
* 1.setBoolean(Object o);2.setByte(Object o);3.setChar(Object o);4.setDouble(Object o);
* 5.setInt(Object o);6.setLong(Object o);7.setShort(Object o);
* @author 小虎牙
*
*/


public class reflact_3 {


public static void main(String[] args) {
Class<pension> c = pension.class;

/**
* 获取共有的所有属性
*
* field.getModifiers()//获取修饰符返回int类型
* 0是默认的
* 1是共有的
* 2是私有的
* 4是保护的
*
*/
System.out.println("------------------------------");
System.out.println("获取类共有的属性");
Field f[] = c.getFields();
for (Field field : f) {
switch (field.getModifiers())
{
case 0:System.out.print(" ");break;
case 1:System.out.print("public ");break;
case 2:System.out.print("private ");break;
case 4:System.out.print("protected ");break;
}
System.out.println(field.getName());
}

System.out.println("------------------------------");
System.out.println("获取本类所有的属性");

/**
* 获取本类所有的属性
*/
f = c.getDeclaredFields();
for (Field field : f) {

//上个方法使用case,这里使用Modifier.toString()取代switch case这个作用

System.out.print(Modifier.toString(field.getModifiers())+" ");
System.out.print(field.getType().getSimpleName()+" ");//这个可以简化一下。getSimpleName()
System.out.println(field.getName());
}


System.out.println("-------------------");

System.out.println("public或者proteced的属性");
//对类进行操作要用到Construct

try {
Constructor cs=c.getConstructor();
pension p=(pension) cs.newInstance();//调用它的无参函数
Field f1=c.getDeclaredField("name");//定义要调用的属性关联Filed
System.out.println(f1.get(p));
f1.set(p, "小明");//修改
System.out.println(f1.get(p));

System.out.println("-------------------");

System.out.println("private的属性");

Field f2=c.getDeclaredField("age");//定义要调用的属性关联Filed
f2.setAccessible(true);//获取权限
System.out.println(f2.get(p));
f2.set(p, 11);//修改
System.out.println(f2.get(p));
} catch (NoSuchMethodException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (SecurityException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} // 调用无参的构造方法
catch (InstantiationException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
package reflect_2020_09_29;

public class pension {
public int id;
private int age;
protected String name;

public pension() {
// TODO 自动生成的构造函数存根
}

public pension(int id) {
super();
this.id = id;

}

public pension(int age, String name) {
super();
this.age = age;
this.name = name;

}

private pension(int id, int age, String name) {
super();
this.id = id;
this.age = age;
this.name = name;
}

@Override
public String toString() {
return "pension [id=" + id + ", age=" + age + ", name=" + name + "]";
}

}