黑马程序员--高薪技术--反射

来源:互联网 发布:手机视频保密软件 编辑:程序博客网 时间:2024/05/17 04:02

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

一、反射的概念:

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;

对于任意一个对象,都能够调用它的任意一个方法和属性;

这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制;


要想解剖一个类,必须先要获取到该类的字节码文件对象。

而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.

二、通过反射获取构造方法并使用

获取构造方法

  getConstructors

  getDeclaredConstructors

创建对象

  newInstance()

  con.newInstance(“zhangsan",20);

三、通过反射获取成员变量并使用

获取所有成员

  getFields,getDeclaredFields

获取单个成员

  getField,getDeclaredField

修改成员的值

  set(Object obj,Objectvalue)

将指定对象变量上此 Field对象表示的字段设置为指定的新值了

四、通过反射获取成员方法并使用

获取所有方法

  getMethods

  getDeclaredMethods

获取单个方法

  getMethod

  getDeclaredMethod

暴力访问

  method.setAccessible(true);

下面演示一个暴力反射的例子:

代码如下:

/*<span style="white-space:pre"></span>先建立一个反射点*/public class ReflectPoint {private int x ;public int y;public String str1 = "ball";public String str2 = "basketball";public String str3 = "itcast";public ReflectPoint(int x ,int y){super();this.x = x;this.y = y;}public String toString(){return str1+ ":" +str2+":"+str3;}}

反射代码如下:

/*获取其他类里的属性和方法*/import java.lang.reflect.*;class ReflectTest3 {public static void main(String[] args)throws Exception {//创建对象ReflectPoint pt1 = new ReflectPoint(5,6);//获取字节码文件,和字段Field fieldY = pt1.getClass().getField("y");System.out.println(fieldY.get(pt1));//因为x为私有变量,所以要暴力反射Field fieldX = pt1.getClass().getDeclaredField("x");fieldX.setAccessible(true);System.out.println(fieldX.get(pt1));//获取字符串也一样Field fieldS = pt1.getClass().getDeclaredField("str1");fieldS.setAccessible(true);System.out.println(fieldS.get(pt1));changeStringValue(pt1);System.out.println(pt1);}//实现字符的替换public static void changeStringValue(Object obj)throws Exception{//得到所有的字段Field[] fields = obj.getClass().getFields();//遍历取出所有字段for (Field field : fields ){//判断是否是String 类字节码文件//是就全部替换if (field.getType()==String.class){String oldValue = (String)field.get(obj);String newValue = oldValue.replace('b','a');field.set(obj,newValue);}}}}

这只是运用了反射的最基本方法,其他的方法可以自己试试看!

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------




0 0
原创粉丝点击