zoukankan      html  css  js  c++  java
  • Java反射机制

    Java的反射机制概念

    主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。

    反射是java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接。但是反射使用不当会成本很高!

    反射的作用

    1 可以反编译将class文件编译成java文件

    2 可以通过反射机制访问Java对象的属性,方法,构造方法等

    反射机制使用步骤

    1 得到要调用类的class

    2 通过得到的class获取调用类型的方法(Method)

    3 通过方法(Method)的invoke进行方法调用

    反射机制常用场景

    1 通过反射获取构造方法从而来产生相应的对象,代码如下:

     1 import java.lang.reflect.Constructor;
     2 
     3 /**
     4  * 
     5  * 
     6  * 通过构造方法产生对象
     7  *
     8  */
     9 public class ReflectionHelloWorld3 {
    10 
    11   /**
    12    * 
    13    */
    14   public ReflectionHelloWorld3() {
    15     // TODO Auto-generated constructor stub
    16   }
    17 
    18   /**
    19    * @param args
    20    */
    21   public static void main(String[] args) {
    22     // TODO Auto-generated method stub
    23     Class<?> c = null;
    24     try {
    //通过全路径名获取对应的Class
    25 c = Class.forName("com.msunsoft.reflection.Foo2"); 26 } catch (Exception e) { 27 e.printStackTrace(); 28 } 29 Foo2 f1 = null; 30 Foo2 f2 = null; 31 //获取所有的构造方法 32 Constructor<?> cons[] = c.getConstructors(); 33 try { 34 f1 = (Foo2) cons[0].newInstance(); 35 f2 = (Foo2) cons[1].newInstance("abc"); 36 f1.print(); 37 f2.print(); 38 39 } catch (Exception e) { 40 e.printStackTrace(); 41 } 42 43 } 44 45 }

    Foo2代码如下:

    /**
     *
     */
    package com.msunsoft.reflection;

    /**
     * @author anquan li
     *
     */
    public class Foo2 {
      String s;

      /**
       *
       */
      public Foo2() {
        // TODO Auto-generated constructor stub
      }

      public Foo2(String s) {
        this.s = s;
      }

      public void print() {
        System.out.println(s);
      }

    }

    运行代码输出: null,abc

    2 通过反射机制修改数组大小,代码如下:

     1 package com.msunsoft.reflection;
     2 
     3 import java.lang.reflect.Array;
     4 
     5 /**
     6  * 
     7  * 
     8  * 修改数组大小
     9  *
    10  */
    11 public class ReflectionHelloWorld4 {
    12 
    13   /**
    14    * 
    15    */
    16   public ReflectionHelloWorld4() {
    17     // TODO Auto-generated constructor stub
    18   }
    19 
    20   /**
    21    * @param args
    22    */
    23   public static void main(String[] args) {
    24     // TODO Auto-generated method stub
    25     int[] intArray = { 1, 2, 3, 4, 5 };
    26     int[] newIntArray = (int[]) changeArraySize(intArray, 10);
    27     print(newIntArray);
    28 
    29     String[] str = { "a", "b", "c", "d", "e" };
    30     String[] str1 = (String[]) changeArraySize(str, 10);
    31     print(str1);
    32 
    33   }
    34 
    35   private static void print(Object obj) {
    36     // TODO Auto-generated method stub
    37     Class<?> c = obj.getClass();
    38     if (!c.isArray()) {
    39       return;
    40     }
    41     System.out.println("
    Array length: " + Array.getLength(obj));
    42 
    43     for (int i = 0; i < Array.getLength(obj); i++) {
    44       System.out.print(Array.get(obj, i) + " ");
    45     }
    46 
    47   }
    48 
    49   /**
    50    * 修改数组大小
    51    * 
    52    * @param obj
    53    * @param i
    54    * @return
    55    */
    56   private static Object changeArraySize(Object obj, int len) {
    57     // TODO Auto-generated method stub
    58     Class<?> arr = obj.getClass().getComponentType();
    59     Object newArray = Array.newInstance(arr, len);
    60 
    61     // 复制数组
    62     int co = Array.getLength(obj);
    63     System.arraycopy(obj, 0, newArray, 0, co);
    64     return newArray;
    65   }
    66 
    67 }

    运行程序输出如下结果:

    Array length: 10
    1 2 3 4 5 0 0 0 0 0
    Array length: 10
    a b c d e null null null null null

  • 相关阅读:
    select应用于read函数 超时非阻塞方式
    取文本索引所执向的值(简单)
    linux c函数指针的应用
    解决vsftp无法启动问题(转)
    Could not chdir to home directory /home/USER: Permission denied
    sscanf和正则表达式
    存储过程重置SEQUENCE值从新开始。
    Signal ()函数详细介绍 Linux函数(转)
    linux 环境NTP配置与开机自启动(转)
    linux下iconv()函数的用法(转载并修改)
  • 原文地址:https://www.cnblogs.com/anqli-java/p/7559676.html
Copyright © 2011-2022 走看看