反射(Reflection)是Java被视为动态(或准动态)语言的一个关键性质。Reflection允许程序在运行时,通过各个反射API,来获得任何一个已知名称的class的各种信息,包括:
1、修饰符modifier。包括public、protected、private、static等等。
2、继承的父类superclass。
3、实现的接口interface。
4、类定义的内部变量field。包括变量的类型、名称、访问级别。
5、类定义的所有方法method。包括方法的名称、参数、返回值、访问级别、抛出的异常。
6、改变变量或方法的访问级别。可通过这种方法来访问类的私有变量,或调用类的私有方法。
7、类所有的构造函数。通过构造方法来实例化一个类对象。
Java中所有的反射活动都是通过Class类来实现的。Class类在Java中是一个非常特殊的类。与其他类一样,Class类也继承自Object,其实体用来表达Java运行时所有的类和接口,也可以表示枚举(enum)、数组(array)、基本类型(int、long、short等等)、void关键字。当一个类被加载时,JVM便生成一个Class类对象。Java中获得Class类的获得途径有如下几种:
1、通过getClass()获得。每个类对象都有一个getClass()方法。
String str = "name"; Class<?> cls = str.getClass();
Class<?> userClass = null; try { userClass = Class.forName("com.example.reflection.User"); } catch (ClassNotFoundException e) { e.printStackTrace(); }
Class c1 = String.class; Class c2 = User.class; Class c3 = int.class; Class c4 = int[].class;
4、使用基本类型的wraper类型获得。即Byte、Boolean、Integer等等。
Class c1 = Boolean.TYPE; Class c2 = Byte.TYPE; Class c3 = Character.TYPE; Class c4 = Short.TYPE; Class c5 = Integer.TYPE; Class c6 = Long.TYPE; Class c7 = Float.TYPE; Class c8 = Double.TYPE; Class c9 = Void.TYPE;
User类
package com.example.reflection; import java.io.Serializable; public class User implements Serializable { /** * */ private static final long serialVersionUID = 1L; /** * User name */ private String name; /** * User age */ private int age; public User() { } public User(final String name) { this.name = name; } public User(int age) { this.age = age; } public User(final String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } private int getAge() { return age; } private void setAge(int age) { this.age = age; } @Override public String toString() { return "Name: " + name + " Age: " + age; } }
Class<?> user = null; try { user = Class.forName("com.example.reflection.User"); } catch (ClassNotFoundException e) { e.printStackTrace(); } System.out.println("=================all the field, public/protected/private===================="); Field[] fieldAll = user.getDeclaredFields(); for (int i = 0; i < fieldAll.length; i++) { System.out.println(Modifier.toString(fieldAll[i].getModifiers()) + " " + fieldAll[i].getType().getName() + " " + fieldAll[i].getName() + ";"); } System.out.println("============the accessible field, including fields in super class/interface======="); Field[] fieldAccessible = user.getFields(); for (int i = 0; i < fieldAccessible.length; i++) { System.out.println(Modifier.toString(fieldAccessible[i].getModifiers()) + " " + fieldAccessible[i].getType().getName() + " " + fieldAccessible[i].getName() + ";"); }
Class<?> user = null; try { user = Class.forName(className); } catch (ClassNotFoundException e) { e.printStackTrace(); } System.out.println("========all the methods======="); Method[] methods = user.getDeclaredMethods(); for (int i = 0; i < methods.length; i++) { Method method = methods[i]; System.out.print(Modifier.toString(method.getModifiers()) + " "); System.out.print(method.getReturnType().getName() + " "); System.out.print(method.getName() + "("); Class<?>[] params = method.getParameterTypes(); for (int j = 0; j < params.length; j++) { Class<?> param = params[j]; System.out.print(param.getName() + " arg" + j); if (j < params.length - 1) { System.out.print(","); } } System.out.print(")"); Class<?>[] exceptions = method.getExceptionTypes(); if (exceptions.length > 0) { System.out.print(" throws "); for (int k = 0; k < exceptions.length; k++) { Class<?> exception = exceptions[k]; System.out.print(exception.getName() + " "); if (k < exceptions.length) { System.out.print(","); } } } System.out.println(";"); }
Class<?> user = null; try { user = Class.forName(className); } catch (ClassNotFoundException e) { e.printStackTrace(); } System.out.println("========all the interfaces======="); Class<?> [] interfaces = user.getInterfaces(); for (int i = 0; i < interfaces.length; i++) { Class<?> class1 = interfaces[i]; System.out.println(class1.getName()); }
Class<?> userClass = null; try { userClass = Class.forName("com.example.reflection.User"); } catch (ClassNotFoundException e) { e.printStackTrace(); } User user1 = null, user2 = null, user3 = null, user4 = null; try { Constructor<?> constructor1 = userClass.getConstructor(); Constructor<?> constructor2 = userClass.getConstructor(String.class); Constructor<?> constructor3 = userClass.getConstructor(new Class<?>[] { int.class}); Constructor<?> constructor4 = userClass.getConstructor(new Class<?>[] { String.class, int.class }); user1 = (User)constructor1.newInstance(); user2 = (User)constructor2.newInstance("xuegang"); user3 = (User)constructor3.newInstance(27); user4 = (User)constructor4.newInstance("xuegang", 27); System.out.println(user1); System.out.println(user2); System.out.println(user3); System.out.println(user4); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); }
Class<?> userClass = null; try { userClass = Class.forName("com.example.reflection.User"); } catch (ClassNotFoundException e) { e.printStackTrace(); } User userInstance = null; try { userInstance = (User)userClass.newInstance(); Field field = userClass.getDeclaredField("name"); field.setAccessible(true); field.set(userInstance, "lengxuegang"); field = userClass.getDeclaredField("age"); field.setAccessible(true); field.set(userInstance, 27); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } System.out.println(userInstance);
Class<?> userClass = null; try { userClass = Class.forName("com.example.reflection.User"); } catch (ClassNotFoundException e) { e.printStackTrace(); } User userInstance = null; try { userInstance = (User)userClass.newInstance(); Method setName = userClass.getMethod("setName", new Class<?>[] {String.class}); setName.invoke(userInstance, "lengxuegang"); Method setAge = userClass.getDeclaredMethod("setAge", new Class<?>[] {int.class}); setAge.setAccessible(true); setAge.invoke(userInstance, 27); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } System.out.println(userInstance);
代码下载:http://download.csdn.net/detail/lxgwm2008/5025076
参考文章:http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html
http://tech.it168.com/j/2007-10-21/200710211609265.shtml