java反射

一.反射概念   

       在运行时,对于任何一个对象能获取到其类信息,任意一个类,都能够知道这个类的所以属性和方法,根据类信息,能构建其对象;
       对于任意一个对象,都能调用它的任意一个(不管是否是私有的)方法和设置其任意一个(不管是否是私有的)属性;
       这种动态获取信息、动态生成对象、及动态调用对象方法的功能叫Java的反射机制。

二.反射的作用

     

1.根据配置生成对应类的对象,提高可配置性,代码灵活性
2.即时编译(运行时根据需要生成java源代码,调用编译器编译的类,加载之后得到Class信息)后,通过反射,构造对象,调用方法,赋予了运行时代码能力增强

 

三.代码示例

     java中反射相关类如下:

Java中主要由以下的类来实现Java反射机制(这些类都位于java.lang.reflect包中):
Class类:代表一个类。 
Field类:代表类的成员变量(成员变量也称为类的属性)。
Method类:代表类的方法。
Constructor类:代表类的构造方法。
Array类:提供了动态创建数组,以及访问数组的元素的静态方法。
Proxy类:动态代理工具类。
InvocationHandler接口:动态代理召唤接口。 Class类是Reflection API中的核心类,主要方法如下: getName():获得类的完整名字。 getFields():获得类的public类型的属性。 getDeclaredFields():获得类的所有属性。 getMethods():获得类的public类型的方法。 getDeclaredMethods():获得类的所有方法。 getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes参数指定方法的参数类型。 getConstrutors():获得类的public类型的构造方法。 getConstrutor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes参数指定构造方法的参数类型。 newInstance():通过类的不带参数的构造方法创建这个类的一个对象

 

 使用示例:

public Object copy(Object object) throws Exception{
    
    //获得对象的类型
    Class classType=object.getClass();
    System.out.println("Class:"+classType.getName());
    
    
    //通过Array(反射)创建数组
    Object array = Array. newInstance( classType/*数组元素类型*/, 3/*数组长度*/);
    //通过Array(反射)设置数组元素
    Array.set(array, 1, object);
    //通过Array(反射)获取数组元素
    Array.get(array, 1/*数组下标*/);
    //通过Array(反射)获取数组元素长度
    Array.getLength(array);
    
    //通过Array(反射)创建多维数组
    Object array3 = Array. newInstance( classType/*数组元素类型*/, new int[]{5,10,7}/*3维数组每个维度的长度*/);
 
    /*
    *通过默认构造方法创建一个新的对象
    *前一个{}中没内容,代表是获取无参构造函数,后一个{}中没内容,代表传的参数为空
    */
    Object objectCopy=classType.getConstructor(new Class[]{}).newInstance(new Object[]{});
 
    //获得对象的所有属性
    Field fields[]=classType.getDeclaredFields();
 
    for(int i=0; i<fields.length;i++){
          Field field=fields[i];
 
          String fieldName=field.getName();
          String firstLetter=fieldName.substring(0,1).toUpperCase();
          //获得和属性对应的getXXX()方法的名字
          String getMethodName="get"+firstLetter+fieldName.substring(1);
          //获得和属性对应的setXXX()方法的名字
          String setMethodName="set"+firstLetter+fieldName.substring(1);
 
          //获得和属性对应的getXXX()方法
          Method getMethod=classType.getMethod(getMethodName,new Class[]{});
          //获得和属性对应的setXXX()方法
          Method setMethod=classType.getMethod(setMethodName,new Class[]{field.getType()});
 
          //调用原对象的getXXX()方法
          Object value=getMethod.invoke(object,new Object[]{});
          System.out.println(fieldName+":"+value);
          //调用拷贝对象的setXXX()方法
         setMethod.invoke(objectCopy,new Object[]{value});
    }
    return objectCopy;
}

 

 

 

 

 

 

 

 

     

posted @ 2022-02-24 11:36  高压锅里的大萝卜  阅读(59)  评论(0编辑  收藏  举报