黑马程序员_java 反射

  反射是jdk1.2就有的特性,在将来的框架中都要用到反射技术,所谓的反射:就是吧java类中的各种成分映射成相应的java类,因此我们首先要明白什么事java类。在java程序中的各个java类属于同一类事物,描述这类事物的java类名就是Class,因此Class类是反射的基石。在这里的Class第一个C是大写的,它不同于我们在编写程序时写的class那个class是小写的,Class类是java类名的名称,Class类的实例对象是代表着一个字节码。所谓字节码就是把一个类的二进制代码加载在内存中即为字节码。用到一种类都会有一份字节码,每一份字节码都是一个Class的实例对象。获取字节码的方法有三种:
1.类名.class                                         例如: System.class
2.对象.getClass()                            例如: new DaTe().getClass
3.Class.forName("类名")                      例如: Class.forName("java.util.Date");     // 实际开发中用的最多的一种方法
 
  在java中存在着9个预定义的Class实例对象分别为:boolean,byte,char,short,int,long,float,double和viod这九种预定义实例对象,他们可以使用上述的第三种方法获取字节码。
  Java反射机制主要提供了以下功能:
1.在运行时判断任意一个对象所属的类;
2.在运行时构造任意一个类的对象;
3.在运行时判断任意一个类所具有的成员变量和方法;
4.在运行时调用任意一个对象的方法。
 
Java Reflection APIs 简介:
在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中
–Class类:代表一个类
–Field类:代表类的成员变量(成员变量也成为类属性)
–Method类:代表类的方法
–Constructor类:代表类的构造方法
–Array类:提供动态创建数组,以及访问数组的元素的静态方法

Java中,无论生成某个类的多少个对象,这些对象都会对应于同一个Class对象。
两个例子程序:

示例一:
import java.lang.reflect.*;  
 public class DumpMethods 
{  
    public static void main(String[] args) throws Exception
        {  
          Class classType = Class.forName("java.lang.String");      //Class对象描述了某个特定的类对象 
          Method[] methods = classType.getDeclaredMethods();           //通过反射获取到所有的方法 
           for(Method m : methods)                                      //打印所有的方法 
             {                                    
                System.out.println(m);  
             }  
      }  
  
}  

示例二:
import java.lang.reflect.*;  
public class InvokeTester 
{  
  public int add(int parm1, int parm2)
     {  
        return parm1 + parm2;  
     }  
   public String echo(String message)
     {  
        return "hello:" + message;  
     }  
    public static void main(String[] args) throws Exception
      {  
         InvokeTester test = new InvokeTester();  
         System.out.println(test.add(1, 2));  
         System.out.println(test.echo("Java"));  
         Class classType = InvokeTester.class;  
         Object o = classType.newInstance();                          //通过反射生成一个InvokeTester类型的对象  
         Method addMethod = classType.getMethod("add", new Class[] { int.class, int.class });    //通过反射获取到add方法  
         System.out.println(addMethod.invoke(o,new Object[]{1,2}));              //调用对象的add方法并把参数传进去     
         Method echoMethod = classType.getMethod("echo", new Class[]{String.class});           //通过反射获取到echo方法  
         System.out.println(echoMethod.invoke(o, new Object[]{"Java"}));             //调用对象的echo方法并把参数传进去  
    }  
}  

    若想通过类的不带参数的构造方法来生成对象,我们有两种方式:
1)先获得Class对象,然后通过该Class对象的newInstance方法直接获得即可。如
Class classType = String.class; 
Object o = classType.newInstance();
2)先获得Class对象,然后通过该Class对象获得所对应的Constructor对象,再通过该Constructor对象的newInstance方法生成。如
Class classType = Customer.class;
Constructor constructor  =classType.getConstructor(new Class[]{});
Object o1 = constructor.newInstance(new Object[]{});

   若想通过类的带参数的构造方法来生成对象,只能使用下面这种方式:
Class classType = Customer.class;
Constructor constructor2  = classType.getConstructor(new Class[]{String.class,int.class});
Object o2 = constructor.newInstance(new Object[]{"张三",20});








你可能感兴趣的:(黑马程序员_java 反射)