反射操作

来源:互联网 发布:单词默写软件 编辑:程序博客网 时间:2024/05/01 11:54
import java.lang.reflect.*;import java.util.Date;public class RefelectTest {/** * 通过反射机制获取类的基本信息(包名,修饰符,类名,基类,实现的接口) */public static void getClassBaseInfo() {try {// 通过String指定要获取那个类的Class,注意,必须是完整的类名,也就是包名+类名格式String className = "com.powernode.refelect.test1.Student";// 获取指定类名的ClassClass claz = Class.forName(className);// 取得包名的信息System.out.println("包名:" + claz.getPackage().getName());// 取得修饰符的信息System.out.println("修饰符:" + Modifier.toString(claz.getModifiers()));// 取得类名的信息(完整的类名)System.out.println("类名:" + claz.getName());// 取得类名的信息(简单的类名)System.out.println("类名:" + claz.getSimpleName());// 取得基类的信息System.out.println("基类:" + claz.getSuperclass().getName());// 取得接口的信息Class[] interfaceClazs = claz.getInterfaces();if (interfaceClazs.length > 0) {System.out.print("实现的接口:");for (Class interfaceClaz : interfaceClazs) {System.out.print(interfaceClaz.getName() + ",");}}} catch (ClassNotFoundException e) {e.printStackTrace();}}/** * 通过反射机制获取类的方法的信息(修饰符,返回类型,方法名称,参数列表,抛出的异常) */public static void getMethodInfo() {try {// 通过String指定要获取那个类的Class,注意,必须是完整的类名,也就是包名+类名格式String className = "com.powernode.refelect.test1.Student";// 获取指定类名的ClassClass claz = Class.forName(className);// 获取方法的信息,claz.getMethods()获取类中的所有的公开的方法的信息(包括继承下来的公开的方法)// Method[] methods = claz.getMethods();// claz.getDeclaredMethods()获取类中声明的所有的方法的信息(包括公开的,保护的,缺省的,私有的,但是没有继承的)Method[] methods = claz.getDeclaredMethods();// 遍历Method的数组for (Method method : methods) {// 从方法上面取得方法的各个信息System.out.print(Modifier.toString(method.getModifiers()) + " ");// 取得方法的返回类型信息System.out.print(method.getReturnType().getName() + " ");// 取得方法名称信息System.out.print(method.getName() + "  ");// 获取方法的参数的信息System.out.print("(");Class[] paramClazs = method.getParameterTypes();for (Class paramClaz : paramClazs) {System.out.print(paramClaz.getName() + ",");}System.out.print(")");// 取得异常的信息Class[] exceptionClazs = method.getExceptionTypes();if (exceptionClazs.length > 0) {System.out.print(" throws ");for (Class exceptionClaz : exceptionClazs) {System.out.print(exceptionClaz.getName() + ",");}}System.out.println();}} catch (ClassNotFoundException e) {e.printStackTrace();}}/** * 通过反射机制获取构造方法的信息(修饰符,类名,参数列表,抛出的异常) */public static void getConstructorInfo() {try {// 通过String指定要获取那个类的Class,注意,必须是完整的类名,也就是包名+类名格式String className = "com.powernode.refelect.test1.Student";// 获取指定类名的ClassClass claz = Class.forName(className);// 获取构造方法的信息// claz.getConstructors()获取类中公开的构造方法的信息// Constructor[] cons =claz.getConstructors();// claz.getConstructors()获取类中声明的的构造方法的信息(包括公开的,保护的,私有的,缺省的)Constructor[] cons = claz.getDeclaredConstructors();if (cons.length > 0) {// 遍历每一个构造方法,分别取得构造方法的信息for (Constructor con : cons) {// 取得修饰符的信息System.out.print(Modifier.toString(con.getModifiers())+ "  ");// 构造方法名称(类名)System.out.print(con.getName() + " ");// 取得参数的信息System.out.print("(");Class[] paramClazs = con.getParameterTypes();if (paramClazs.length > 0) {for (Class paramClaz : paramClazs) {// System.out.print(paramClaz.getName() + "-" +// paramClaz.getSimpleName() + "," );System.out.print(paramClaz.getSimpleName() + ",");}}System.out.print(") ");// 取得异常的信息Class[] exceptionClazs = con.getExceptionTypes();if (exceptionClazs.length > 0) {System.out.print(" throws ");for (Class exceptionClaz : exceptionClazs) {System.out.print(exceptionClaz.getName() + ",");}}System.out.println();}}} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/** * 通过反射机制创建对象 *  * @return */public static Object createObject() {Object obj = null;try {// 通过String指定要获取那个类的Class,注意,必须是完整的类名,也就是包名+类名格式String className = "com.powernode.refelect.test1.Student";// 获取指定类名的ClassClass claz = Class.forName(className);// 通过参数列表,获取指定的构造方法Class[] paramClazs = { String.class, String.class, Sex.class,int.class };Constructor con = claz.getDeclaredConstructor(paramClazs);// 设置con是可以访问的con.setAccessible(true);obj = con.newInstance("张三", "1987-12-8", Sex.男, 178);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SecurityException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (NoSuchMethodException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InvocationTargetException e) {// TODO Auto-generated catch blocke.printStackTrace();}return obj;}/** * 通过反射机制调用类中的方法 */public static void invokeMethod() {// 获取Student类的ClassClass claz = Student.class;try {// Method m1 = claz.getDeclaredMethod("toString1", Integer.class);Method m1 = claz.getDeclaredMethod("toString1", Integer.TYPE);m1.setAccessible(true);// 调用方法,创建对象Object obj = createObject();// "张三", "1987-12-8", Sex.男, 178Object res = m1.invoke(obj, 100);System.out.println(res);} catch (SecurityException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (NoSuchMethodException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InvocationTargetException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static void changeField() {try {Object obj = createObject();Class claz = obj.getClass();// 取得类中的属性,也就是FieldField nameField = claz.getDeclaredField("name");Field sexField = claz.getDeclaredField("sex");Field heightField = claz.getDeclaredField("height");Field birthdayField = claz.getDeclaredField("birthday");nameField.setAccessible(true);sexField.setAccessible(true);heightField.setAccessible(true);birthdayField.setAccessible(true);// 修改属性的值heightField.setInt(obj, 180);nameField.set(obj,"张4");birthdayField.set(obj, new Date());sexField.set(obj, Sex.女);// 取得对象上面的属性int  height = heightField.getInt(obj);String name = (String)nameField.get(obj);Sex sex = (Sex)sexField.get(obj);Date birthday = (Date)birthdayField.get(obj);System.out.println(height + "," + name + "," + sex + "," + birthday);} catch (SecurityException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (NoSuchFieldException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalArgumentException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static void main(String[] args) {// getClassBaseInfo();// getMethodInfo();// getConstructorInfo();// Object obj = createObject();// System.out.println(obj);//invokeMethod();changeField();}}

0 0
原创粉丝点击