黑马程序员——JAVA反射机制基础

来源:互联网 发布:mac可以玩使命召唤吗 编辑:程序博客网 时间:2024/06/16 09:57
-------android培训、java培训、期待与您交流! ----------
1.定义:
    JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言
    曾经也有人这么概括:反射就是把Java类中的各种成分映射成相应的java类
2.功能:
    Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
3.说到两个特殊的类
    1.Object----是所有Java类的继承根源
    2.Class-----它和一般类一样继承自Object,其实体用以表达Java程序运行时的classes和interfaces,也用来表达enum、array、primitive Java types(boolean, byte, char, short, int, long, float, double)以及关键词void
4.举一些例子
Class cls1 = Date.class//字节码1;
Class cls2 = Person.class//字节码2;
Class.forName("java.lang.String");//加载字节码(1.如果字节码已经被缓存到java虚拟机内存中,那么直接返回,如果在硬盘上,那么通过类加载器加载到java虚拟机内存中,然后返回对应的类字节码
5.获取类字节码的三种方式:
获取类字节码的三种方式 
1.类名.class,例如;System.class
2.对象.getClass(),例如。new Date().getClass();
3.Class.forName("类名"),例如,Class.forName("java.util.Date");
6.九个常见的Class对象:
boolean,byte,char,short,int,long,float和关键字void
数组类型的Class实例对象:
7.反射应用的方面:
1,构造方法
举例
Constructor类代表某个类中的一个构造方法
得到某个类所有的构造方法 
例子:Constructor[] constructors = Class.forName("java.lang.String").getConstructors();
得到某个类某个特定的构造方法 
例子:Constructor constructor1 = String.class.getConstructor(StringBuffer.class);
创建实例对象: 
通常方式:String str = new String(new StringBuffer("abc"));
反射方式:String str2 = (String)constructor1.newInstance(new StringBuffer("abc"));
//调用获得的方法时要用到上面相同类型的实例对象
System.out.println(str2.charAt(2));
Class.newInstance()方法: 
例子:String obj = (String)Class.forName("java.lang.String").newInstance();
该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象。
该方法内部的具体代码是怎么写的呢?用到了缓存机制来保存默认构造方法的实例对象。

2.成员变量
public class ReflectTest{ public static void main(String[] args){  ReflectPoint pt1 = new RfelectPoint(3,5);  Field fieldY = pt1.getClass().getFiled("y");//getFiled只能得到public的变量‘y'与类中大小写一致  //fieldY的值不是5、、fieldY不是对象身上的 变量,而是类上,要用它去取某个对象上对应的值  System.out.println(fieldY.get(pt1));//打印出5   Field fieldX = pt1.getClass().getDeclaredField("x");  fieldX.setAccessible(true);  System.out.println(fieldX.get(pt1)); }}

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




在比较对象的时候,注意 ==,equals的应用区别
3.成员方法
注意jdk,api的版本兼容问题
new int[]{1,2,3};
new String[] {new String("abc"),new String("xyz"),new String("123");
str1 = "abc";
Method methodCharAt = String.class.getMethod("charAt",int.class);
System.out.println("methodCharAt.invoke(str1,1));如果str1处换成null,那么这个方法是静态的
jdk1.4,1.5兼容问题;
System.out.println(methodCharAt.invoke(str1,new Object[]{2}));

java例子
public class ReflectTest{ public static  void main(String[] args){  String str1 = "abc";  Class cls1 = str1.getClass();  Class cls2 = String.class;  Class cls3 = Class.forName("java.lang.String");  System.out.println(cls1 == cls2);//true  System.out.println(cls1 == cls3);//true   System.out.println(cls1.isPrimitive());//false  System.out.println(int.class.isPrimitive());//true  System.out.println(int.class == Integer.class);//false  System.out.println(int.class == Integer.Type);//true  System.out.println(int[].class.isPrimitive());//false  System.out.println(int[].class.isArray());//true }

}
0 0