package j2se_develop;
import java.lang.reflect.Field;
/**
* Field类代表某个类中的一个成员变量
*
*
* @author wjw
*
*/
public class Field_class {
public static void main(String[] args) throws SecurityException, IllegalArgumentException, NoSuchFieldException, IllegalAccessException {
// method();
method1();
}
public static void method() throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException{
FieldClass fc=new FieldClass(6567657,43243233,"ball","baskball","jack");
Field f_b=fc.getClass().getField("b");//通过变量名获取对应的Field,但会实例化多个FieldClass类
System.out.println(f_b.get(fc));//因为有许多FieldClass对象,所以要取出对应的值,要确定具体的FieldClass类对象
//下面用getField获取a的值时,因为a被私有化,所以拿不到
// Field f_a=fc.getClass().getField("a");//通过变量名获取对应的Field,但会实例化多个FieldClass类
// System.out.println(f_a.get(fc));//因为有许多FieldClass对象,所以要取出对应的值,要确定具体的FieldClass类对象
Field f_aa=fc.getClass().getDeclaredField("a");//getDeclaredField()方法,获取只要声明过的就能获取,不管私有还是公有
f_aa.setAccessible(true);//设置f_aa获取的私有属性强制可以获取,称为暴力反射
System.out.println(f_aa.get(fc));
}
/*
* 把字符串参数中所有的b改成a
*/
public static void method1() throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException{
FieldClass fc=new FieldClass(244,3,"ball","baskball","jabck");
//下面是单独过去每一个值
// Field f_str1=fc.getClass().getField("str1");
// Field f_str2=fc.getClass().getField("str2");
// Field f_str3=fc.getClass().getField("str3");
// String str1=(String) f_str1.get(fc);
// String str2=(String) f_str2.get(fc);
// String str3=(String) f_str3.get(fc);
//下面用迭代
Field[]fields=fc.getClass().getFields();
for(Field field:fields){
// if(ff.getType().equals(String.class)){//这种比较方式不是很专业,因为只有一份Class,所以可以直接用==
// }
if(field.getType()==String.class){
String oldStr=(String)field.get(fc);
String newStr=oldStr.replace('b','a');
field.set(fc,newStr);//修改值
}
// System.out.println(field.get(fc));//显示各个参数值
}
System.out.println(fc.toString());
}
}
class FieldClass{
private int a;//注意这里,a为私有,要注意
public int b;
public String str1;
public String str2;
public String str3;
//两种方式:
//一:快捷键 alt+shift+s选择Generate Constructor using Fielids...
//二:击右键 Source 选择Generate Constructor using Fielids...
//即可生成下面的构造方法,
public FieldClass(int a,int b,String str1,String str2,String str3) {
super();
this.a = a;
this.b = b;
this.str1=str1;
this.str2=str2;
this.str3=str3;
}
public String toString(){
return this.str1+",,,,,,,"+this.str2+",,,,,,"+this.str3;
}
}
黑马程序员——反射之Field类 成员变量
最新推荐文章于 2022-03-26 16:55:54 发布