Java反射中常用的操作方法
jopen
12年前
一、在JDK中,主要由以下来实现Java反射机制,这些类都位于java.lang.reflect包中:
Class类: 代表一个类;
Field类: 代表类的成员变量;
Method类: 代表类的方法;
Constructor类: 代表类的构造方法;
Array类:提供了动态创建数组,以及访问数组元素的静态方法。
二、以下以代码进行解释:
1) Java语言提供一种直接获得Class实例的简便快捷方式(当使用此技术时,装入类涉及的所有工作都在内部进行):
Class clazz = MyClass.class;
但是,如果需要在运行时从某些外部源读取类名时,就需要使用一个类装入器来查找类信息,此时需要使用下面的方法:
String name = "MyClass"; Class clazz = null; try { clazz = Class.forName(name); } catch (ClassNotFoundException e) { e.printStackTrace(); }
2)如何使用Constructor、Field、及Method:
package com.test.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class MyClass { private String str1; private String str2; public MyClass(String s1, String s2) { str1 = s1; str1 = s2; } public String sayHello(String name) { return "Hello " + name ; } public static void main(String[] args) { try { //创建类的对象 Class[] types = new Class[] {String.class, String.class}; Constructor<MyClass> cons = MyClass.class.getConstructor(types); Object[] objs = new Object[] {"a", "b"}; MyClass clazz =(MyClass) cons.newInstance(objs); System.out.println(clazz.toString()); //创建类的方法 //创建类的字段(获得Class的字段信息不同于构造函数的调用,在参数类型数组中使用了字段名) Field field = MyClass.class.getDeclaredField("str1"); //操作类的字段 field.set(clazz, "xxx"); System.out.println(field.get(clazz)); //创建类的方法(获得Class的方法信息与用于构造函数和字段的调用非常类似) Class[] types2 = new Class[] {String.class}; Method method = MyClass.class.getMethod("sayHello", types2); //调用方法 Object[] strs = new Object[] {"World"}; Object result = method.invoke(clazz, strs); System.out.println(result.toString()); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } } public String getStr1() { return str1; } public void setStr1(String str1) { this.str1 = str1; } public String getStr2() { return str2; } public void setStr2(String str2) { this.str2 = str2; } }