java-反射-3

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 + "]";
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码浪人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值