Java基础之反射实例(实例化Account与修改属性)

版权声明:学习之路,任重道远 https://blog.csdn.net/weixin_43359405/article/details/83349158

要求:

   设计Account类,并且添加属性id、name、balance,添加get和set方法与存取钱的方法。

   设计ReflectAccountTest类,实例化Account对象,存如100元,与取1000元的结果显示。

相关资料:参考之前的反射应用(如何获取对象的构造方法、属性、普通方法)博文。

设计如下:

Account类:


package com.briup.ch25;

public class Account
{
	protected int id;
	public String name;
	private double balance;
	
	///构造方法
	public Account(int id,String name,double balance)
	{
		this.id = id;
		this.name = name;
		this.balance = balance;
	}

	public Account(){
	    this.id = 0;
	    this.name = null;
	    this.balance = 0.0;
	}

   ///添加get和set方法
   public void setId(int id){
      this.id = id;
   }

   public int getId(){
     return this.id;
   }

   public void setName(String name){
      this.name = name;
   }
   public String getName(){
       return this.name;
   }

   public void setBalance(double balance){
       this.balance = balance;
   }

   public double getBalance(){
       return this.balance;
   }

   ///提供存钱的方法和取钱的方法
   public double addMoney(int amount){
       if(amount <= 0)
	 return balance;
       balance+=amount;
       return balance;
   }
   public double needMoney(int amount){
       if(amount <= 0 || balance<amount)
 		return balance;
       balance-=amount;
       return balance;
   }

}  

设计ReflectAccountTest类如下:


package com.briup.ch25;

import java.lang.reflect.*;
/*
1.调用set,get方法为id赋值1000,name赋值为briup,balance赋值为10000

2.调用存钱和取钱的方法。分别存入100,取出1000之后,打印结果显示
*/
class  ReflectAccountTest 
{
	public static void main(String[] args) throws Exception {
	   ///获取类镜像
	   Class clz = Class.forName("com.briup.ch25.Account");
	    /**
	      已经知道到了Account的构造方法存在这个,具体怎么知道的,通过输出贡枣方法的种类可查询
	      参考代码:ch25中的ReflectTest.java
           */
           ///创建一个该对象
	   Constructor con=clz.getDeclaredConstructor(int.class,String.class,double.class);
	   Account account=(Account)con.newInstance(1000 , "briup"  , 10000);
	   ///打印结果显示
	   printResult(clz , account);
	   ///print Property
	   Property(clz);
	   /*
	    *调用存钱和取钱的方法。分别存入100,取出1000之后,打印结果显示
	   */
          //第一个参数代表方法名,第二个参数代表参数列表类型,如果有参数列表则写成参数类型.class 例如

String.class,int.class
	   System.out.println("implementation changes me Money:");
	   ModifytheMoney( clz , account , "addMoney" , 100);
           ModifytheMoney( clz , account , "needMoney" , 1000);
	   System.out.println("changes over!");
	   ///Modify(修改) the Properties
           ModifytheProperties( clz , account , "name" , "ModifyBriup");
	   ///打印结果显示
	   printResult(clz , account);
	}

	public static void ModifytheMoney(Class clz,Account account , String operationMothod , int Num) 

throws Exception{
           /*
	     Num One:Modify the Properties
	     Method mt1=clz.getDeclaredMethod("test",null);
	     //mt1.invoke(stu,null);
	     //直接传类镜像
	     mt1.invoke(clz,null);
	   */
	   ///存取钱
           Method mt=clz.getDeclaredMethod(operationMothod,int.class);
           //第一个参数代表实例化对象,第二个参数代表参数列表的实参,下面相当于String name=stu.getName();
           double balance=(double)mt.invoke( account , Num);
	   ///输出修改的结果
           System.out.println("operation result:"+balance);
	}

	public static void ModifytheProperties(Class clz , Account account , String property , String 

ModifyValue) throws Exception{
	    Field field=clz.getDeclaredField( property );
	    //该属性设置为可操作
	    field.setAccessible(true);
	    //第一个参数是实例化后的对象,第二个参数是要传的值
	    field.set(account , ModifyValue);
	}

	public static void printResult(Class clz ,Account account ) throws Exception{
	   Method mt1=clz.getDeclaredMethod("getName",null);
	   Method mt2=clz.getDeclaredMethod("getId",null);
	   Method mt3=clz.getDeclaredMethod("getBalance",null);
	   //第一个参数代表实例化对象,第二个参数代表参数列表的实参,下面相当于String name=stu.getName();
       String name=(String)mt1.invoke(account,null);
       int id=(int)mt2.invoke(account,null);
	   double balance=(double)mt3.invoke(account,null);
	   System.out.println("\n\n---------------输出该对象存在的所有属性值:---------------");
       System.out.println("print result:name:"+name+" id:"+id+" :balance:"+balance);
	   System.out.println("-------------------打印结果结束!--------------------------\n\n");
	}


	public static void Property(Class clz) throws Exception{
	   ///打印存在的属性结果
	  System.out.println("\n\n---------------输出该对象存在的所有属性:---------------");
	  Field[] f = clz.getDeclaredFields();
	  for(Field temp : f){
	    //获取属性的数据类型
		Class c=temp.getType();
		//获取属性的名字
		String name=temp.getName();
		//获取属性修饰符
		int m=temp.getModifiers();
		///输出
		System.out.println("类型:"+m+" 名字:"+c+" 修饰符:"+name);
	  }
	  System.out.println("-------------------打印结果结束!-------------------------\n\n");
	}
}

结果显示如下:

注:public类型为1,private类型为2,protected类型为4。泛型名字为class路径,基本数据类型不变。

猜你喜欢

转载自blog.csdn.net/weixin_43359405/article/details/83349158
今日推荐