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 @   高压锅里的大萝卜  阅读(63)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示