1.定义:


    JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。


    曾经也有人这么概括:反射就是把Java类中的各种成分映射成相应的java类


2.功能:


    Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。


3.说到两个特殊的类


    1.Object----是所有Java类的继承根源


它和一般类一样继承自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
 }