接收字段的成员属性与接收数组参数的成员方法的进行反射

       /*
 *  定义用于操作的属性和方法
 */
public class ChangeStringValue {
     private int x;
     public int y;
     public String str1="asbbdfsf";
     public String str2="gfdbgsaa";
     public String str3="gfgf";
 public ChangeStringValue(int x, int y) {
  super();
      this.x = x;
      this.y = y;
 }
 @Override
 public String toString() {
  
      return str1+":"+str2+":"+str3;
 }
    
}

 

 

public class Test {

 /**
  * 接收字段的成员属性与接收数组参数的成员方法的进行反射
  */
 public static void main(String[] args) throws Exception {
  ChangeStringValue p1=new ChangeStringValue(3, 5);
      Field fieldy=p1.getClass().getField("y"); //获取变量名为y的字节码文件
                //field不是对象身上的变量,而是类身上
          System.out.println(fieldy.get(p1)); //获取字节码里面的元素并打印
          Field fieldx=p1.getClass().getDeclaredField("x");//获取私有变量名为x的字节码文件
  
              fieldx.setAccessible(true);  //为了使x变量不隐藏要把field设置为true;
          System.out.println(fieldx.get(p1));//获取字节码里面的元素
             changeStringValue(p1);
          System.out.println(p1);
  
  //接收数组参数的成员方法进行反射
      String string="asdfc";
      Method methedCharAt=String.class.getMethod("charAt", int.class); //获取参数的截取方法
      System.out.println(methedCharAt.invoke(string, 1)); //方法调用方法进行截取字符串中下标为1个字符
      System.out.println(methedCharAt.invoke(string, new Object[]{2})); //截取字符串中下标为2的字符
          String stringName=args[0]; //字符串数组长度为一
       Method mainMethod=Class.forName(stringName).getMethod("main", String[].class);//获取Class stringClassName类中“main”
       mainMethod.invoke(null, (Object)new String[]{"123","321","dsa"}); //methed方法调用invoke方法传参
        //(Object)new String[]{"123","321","dsa"}这里的String数组被转换为Object中的一个元素   
 }
 //接收字段成员属性为String类型进行反射
 private static void changeStringValue(Object obj)throws Exception {
         Field [] fields=obj.getClass().getFields(); //获取obj的class字节码文件存入数组
        for(Field f:fields){
          if(f.getType()==String.class){ //如果该字段为String类型
              String oldValue=(String) f.get(obj);  //将obj转换为String类型
              String newValue=oldValue.replace('b', 'a'); //替换字符
                f.set(obj, newValue);//重新赋值给obj
       }
  }
  int []x1=new int[3];
  int []x2=new int[4];
  int [][]x3=new int[2][3];
  String []x4=new String[3];
  System.out.println(x1.getClass().getName()==x2.getClass().getName()); //如果是同一类型的数组,并且维数相同那么得到的字节码是同一份;
  System.out.println(x1.getClass().getName()==x3.getClass().getName());
  System.out.println(x1.getClass().getName()==x4.getClass().getName());
  System.out.println(x1.getClass().getName());  //获取字节码的名称
  System.out.println(x1.getClass().getSuperclass().getName());//打印x1的父类名称
  System.out.println(x4.getClass().getSuperclass().getName());
  
  Object objx1=x1;  //int类型的数组是Object
  Object objx2=x4;
  //Object[] objx3=x1; //1维数组不是Object数组
  Object []objx4=x3;  //2维数组是Object数组
  Object []objx5=x4; //String类型的数组是Object
  Object objs=null;
  printObject("asdm");
  printObject(fields);
 }
 private static void printObject(Object objs) {
       Class class1=objs.getClass();  //获取字节码文件
           if(class1.isArray()){  //如果是数组
               int len= Array.getLength(objs);  //获取数组长度
             for (int i = 0; i < len; i++) {
               System.out.println(Array.get(objs, i)); //分行打印数组
             }
          }else{
           System.out.println(objs);
        }
  
     }

}

class  stringClassName{
      public static void main(String[] args) {
         for(String s:args){ //高级for循环
            System.out.println(s);
         }
      }
}

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值