反射之Field

来源:互联网 发布:营销网络的建设 编辑:程序博客网 时间:2024/04/30 02:09

package com.ncs;

public class Point {

 private int x;
 public int y;
 
 public Point(int x, int y) {
  super();
  this.x = x;
  this.y = y;
 }
 
}

 

package com.ncs;

import java.lang.reflect.Field;

//need another bean Point
public class ReflectTest {
 //★这里说的Field都是 类 身上的,不是实例上的
 public static void main(String[] args) throws Exception {
  
  Point pt1 = new Point(3,5);
  
  //得到一个字段
  Field fieldY = pt1.getClass().getField("y"); //y 是变量名
  //fieldY的值是5么?? 大错特错
  //fieldY和pt1根本没有什么关系,你看,是pt1.getClass(),是 字节码 啊
  //不是pt1对象身上的变量,而是类上的,要用它取某个对象上对应的值
  //要这样
  System.out.println(fieldY.get(pt1)); //这才是5
  
  //现在要x了
  
  /*
  Field fieldX = pt1.getClass().getField("x"); //x 是变量名
  System.out.println(fieldX.get(pt1));
  */
  
  //运行 报错 私有的,找不到
  //NoSuchFieldException
  //说明getField 只可以得到 公有的
  //怎么得到私有的呢??
  
  /*
  Field fieldX = pt1.getClass().getDeclaredField("x"); //这个管你公的私的,都拿来
  //然后轮到这里错了
  // java.lang.IllegalAccessException:
  //Class com.ncs.ReflectTest can not access a member of class com.ncs.Point with modifiers "private"
  System.out.println(fieldX.get(pt1));
  */
  
  //三步曲 一是不让你知道我有钱 二是把钱晃一下,不给用  三是暴力抢了
  
  //暴力反射 
  Field fieldX = pt1.getClass().getDeclaredField("x"); //这个管你公的私的,都拿来
  fieldX.setAccessible(true);//上面的代码已经看见钱了,开始抢了
  System.out.println(fieldX.get(pt1));
  
  //out 3 OK!!
  
  
 }
}

package com.ncs;

public class Point {

 private int x;
 public int y;
 
 public  String s1 ="ball";
 public String s2="hubin";
 public String s3="zhangxiaoxiang";
 //做实验而已,字段不可能是 public 的
 
 public Point(int x, int y) {
  super();
  this.x = x;
  this.y = y;
 }
 
}

---------------------------
来自网页的消息
---------------------------
代码已被复制到剪贴板
---------------------------
确定  
---------------------------

0 0
原创粉丝点击