A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© mz585858 中级黑马   /  2016-6-10 22:22  /  307 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在JAVA中,框架一般都会用到反射。学习反射,必须学习Class 类,
这里的Class 中c 是大写的。java的类用于描述某一类事物,该类事物具体有什么属性,有什么功能。至于这个属性值具体是什么,则是由这个类的实例对象来确定的,不同的实例对象有不同的属性值。一般来讲,我们定义一个类 Person ,那么 Person 的对象我们可以通过new 直接创建
如: Person p1=new Person()。而Class 类不能直接new 来创建对象的,它的对象代表的是内存里面的一份字节码,因此只能这样创建:Class c1=Person.class。
获取各个字节码对应的实例对象有三种方法:
(1) 类名.class ,例如 System.class;
(2) 对象.getclass(),例如 new Person().getclass();
(3) Class.forName(“类名”);例如,Class.forName(“java.util.Date”);
反射的时候,主要用第三种方法。
反射就是把java类中的各种成分映射成相应的java类。

Method类可以得到每个类的方法。
String str1 = "abc";
Method methodCharAt = String.class.getMethod("charAt", int.class);
System.out.println(methodCharAt.invoke(str1, 2)); //得到c
如果传递给Method对象的invoke()方法的第一个参数为null,这说明该Method对象对应的是一个静态方法。

获取某个类的所有构造方法:
Constructor constructors[]=Class.forName(“java.lang.String”).getConstructors();//Constructor代表某个类中的一个构造方法。
获取某个构造方法:
Constructor constructor=Class.forName(“java.lang.String”).getConstructor(StringBuffer.class); 在获得方法的时候要用到类型。

实例对象的创建:
普通方式:String str=new String(new StringBuffer(“abc”));
反射方式:String str=(String)constructor.newInstance(new StringBuffer(“abc”));

Field 类代表某个类中的一个成员变量。
比如定义一个Reflect  类
public class Reflect {
private int x;
public int y;
public Reflect(int x, int y) {
this.x = x;
this.y = y;
}
通过ReflectPoint pt1 = new Reflect(2,4);
Field fieldY = pt1.getClass().getField("y"); y的值为4。
Field fieldx = pt1.getClass().getDeclaredField("x");
fieldx.setAccessible(true);
System.out.println(fieldy.get(pt1));
System.out.println(fieldx.get(pt1));
但是需要记住fieldY不是对象身上的变量,而是类上,要用它去取某个对象上对应的值。
Field fieldX = pt1.getClass().getField("x");是错误的,取不到X的值,因为x是private的,getField方法无法访问私有变量的,需要使用getDeclaredField方法。
最重要的一点,输出得到的值时候,System.out.println(fieldY.get(pt1));这可以直接打印输出Y的值为4,但是System.out.println(fieldX.get(pt1));却不能直接输出X,需要加上一行代码fieldX.setAccessible(true);之后才能显示,这称之为 暴力反射
Collection是集合类的上级接口,继承与他的接口主要有Set 和List.
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马