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
时间: 2024-11-10 17:05:09