Java基础之反射实例(实例化Account与修改属性)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java基础之反射实例(实例化Account与修改属性),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4316字,纯文字阅读大概需要7分钟。
内容图文
![Java基础之反射实例(实例化Account与修改属性)](/upload/InfoBanner/zyjiaocheng/849/3fb73dbc551d4b9fa69bba25a65c7a3d.jpg)
要求:
设计Account类,并且添加属性id、name、balance,添加get和set方法与存取钱的方法。
设计ReflectAccountTest类,实例化Account对象,存如100元,与取1000元的结果显示。
相关资料:参考之前的反射应用(如何获取对象的构造方法、属性、普通方法)博文。
设计如下:
Account类:
package com.briup.ch25;
public class Account
{
private int id;
private 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
ModifytheMoney( clz , account , "addMoney" , 100);
ModifytheMoney( clz , account , "needMoney" , 1000);
///Modify(修改) the Properties
ModifytheProperties( clz , account , "name" );
///打印结果显示
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) throws Exception{
Field field=clz.getDeclaredField( property );
//该属性设置为可操作
field.setAccessible(true);
//第一个参数是实例化后的对象,第二个参数是要传的值
field.set(account,"zz");
}
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("---------------输出该对象存在的所有属性值:---------------");
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("---------------输出该对象存在的所有属性:---------------");
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路径,基本数据类型不变。
内容总结
以上是互联网集市为您收集整理的Java基础之反射实例(实例化Account与修改属性)全部内容,希望文章能够帮你解决Java基础之反射实例(实例化Account与修改属性)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。