Java反射机制

Posted anqli_java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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("\nArray 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

 






















以上是关于Java反射机制的主要内容,如果未能解决你的问题,请参考以下文章

反射机制入门

反射机制入门

java 反射代码片段

深入理解java的反射机制

Java反射机制

Java核心技术梳理-类加载机制与反射