要求:
设计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路径,基本数据类型不变。