Java反射详解

来源:互联网 发布:sybase数据库win7 编辑:程序博客网 时间:2024/05/22 06:12

本篇文章采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理论,会有更好的理解。

下面是java反射的三个例子

Reflection,通过一个类名,打印出构造函数,方法和变量

package senior;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.lang.reflect.Modifier;import java.util.Scanner;public class ReflectionTest {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubString name;if (args.length > 0)name = args[0];else {System.out.println("Enter class name (e.g. java.util.Date): ");Scanner in = new Scanner(System.in);name = in.nextLine();}try {Class<?> cl = Class.forName(name);Class<?> superClass = cl.getSuperclass();String modifiers = Modifier.toString(cl.getModifiers());if (modifiers.length() > 0)System.out.print(modifiers + " ");System.out.print("class " + name);if (superClass != null && superClass != Object.class)System.out.print("extends " + superClass.getName());System.out.print("\n{\n");printConstructors(cl);// 打印构造方法System.out.println();printMethods(cl);// 打印方法System.out.println();printFields(cl);// 打印数据成员System.out.println("}");} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.exit(0);}private static void printFields(Class<?> cl) {// TODO Auto-generated method stubField[] fields = cl.getDeclaredFields();for (Field f : fields) {System.out.print("\t");Class<?> type = f.getType();String name = f.getName();String modifiers = Modifier.toString(f.getModifiers());if (modifiers.length() > 0)System.out.print(modifiers + " ");System.out.println(type.getName() + " " + name + ";");}}private static void printMethods(Class<?> cl) {// TODO Auto-generated method stubMethod[] methods = cl.getDeclaredMethods();for (Method m : methods) {System.out.print("\t");Class<?> retType = m.getReturnType();String name = m.getName();String modifiers = Modifier.toString(m.getModifiers());System.out.print(modifiers + " ");System.out.print(retType + " " + name + "(");@SuppressWarnings("rawtypes")Class[] paramTypes = m.getParameterTypes();for (int j = 0; j < paramTypes.length; j++) {if (j > 0)System.out.print(", ");System.out.print(paramTypes[j].getName());}System.out.println(");");}}private static void printConstructors(Class<?> cl) {// TODO Auto-generated method stub@SuppressWarnings("rawtypes")Constructor[] constructors = cl.getDeclaredConstructors();for (Constructor<?> c : constructors) {System.out.print("\t");String name = c.getName();String modifiers = Modifier.toString(c.getModifiers());System.out.print(modifiers + " ");System.out.print(name + "(");@SuppressWarnings("rawtypes")Class[] paramTypes = c.getParameterTypes();for (int j = 0; j < paramTypes.length; j++) {if (j > 0)System.out.print(", ");System.out.print(paramTypes[j].getName());}System.out.println(");");}}}

运行结果:


MethodPointer相当于C/C++中的回调函数

package senior;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class MethodPointerTest {/** * @param args * @throws NoSuchMethodException * @throws SecurityException */public static void main(String[] args) throws SecurityException,NoSuchMethodException {// TODO Auto-generated method stubMethod square = MethodPointerTest.class.getMethod("square",double.class);Method sqrt = Math.class.getMethod("sqrt", double.class);printTable(1, 10, 10, square);printTable(1, 10, 10, sqrt);}public static double square(double x) {return x * x;}private static void printTable(int i, int j, int k, Method f) {// TODO Auto-generated method stubdouble x = (j - i) / (k - 1);for (double l = i; l <= j; l += x) {double y;try {y = (Double) f.invoke(null, l);System.out.printf("%10.4f|%10.4f%n", l, y);} 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();}}}}

运行结果:



泛型反射实例

package junior;import java.lang.reflect.*;import java.util.*;public class GenericReflectionTest {public static void main(String[] args) {// read class name from command line args or user inputString name;if (args.length > 0)name = args[0];else {Scanner in = new Scanner(System.in);System.out.println("Enter class name (e.g. java.util.Collections): ");name = in.next();}try {// print generic info for class and public methodsClass<?> cl = Class.forName(name);printClass(cl);for (Method m : cl.getDeclaredMethods())printMethod(m);} catch (ClassNotFoundException e) {e.printStackTrace();}}public static void printClass(Class<?> cl) {System.out.print(cl);printTypes(cl.getTypeParameters(), "<", ", ", ">", true);Type sc = cl.getGenericSuperclass();if (sc != null) {System.out.print(" extends ");printType(sc, false);}printTypes(cl.getGenericInterfaces(), " implements ", ", ", "", false);System.out.println();}public static void printMethod(Method m) {String name = m.getName();System.out.print(Modifier.toString(m.getModifiers()));System.out.print(" ");printTypes(m.getTypeParameters(), "<", ", ", "> ", true);printType(m.getGenericReturnType(), false);System.out.print(" ");System.out.print(name);System.out.print("(");printTypes(m.getGenericParameterTypes(), "", ", ", "", false);System.out.println(")");}public static void printTypes(Type[] types, String pre, String sep,String suf, boolean isDefinition) {if (pre.equals(" extends ")&& Arrays.equals(types, new Type[] { Object.class }))return;if (types.length > 0)System.out.print(pre);for (int i = 0; i < types.length; i++) {if (i > 0)System.out.print(sep);printType(types[i], isDefinition);}if (types.length > 0)System.out.print(suf);}public static void printType(Type type, boolean isDefinition) {if (type instanceof Class) {Class<?> t = (Class<?>) type;System.out.print(t.getName());} else if (type instanceof TypeVariable) {TypeVariable<?> t = (TypeVariable<?>) type;System.out.print(t.getName());if (isDefinition)printTypes(t.getBounds(), " extends ", " & ", "", false);} else if (type instanceof WildcardType) {WildcardType t = (WildcardType) type;System.out.print("?");printTypes(t.getUpperBounds(), " extends ", " & ", "", false);printTypes(t.getLowerBounds(), " super ", " & ", "", false);} else if (type instanceof ParameterizedType) {ParameterizedType t = (ParameterizedType) type;Type owner = t.getOwnerType();if (owner != null) {printType(owner, false);System.out.print(".");}printType(t.getRawType(), false);printTypes(t.getActualTypeArguments(), "<", ", ", ">", false);} else if (type instanceof GenericArrayType) {GenericArrayType t = (GenericArrayType) type;System.out.print("");printType(t.getGenericComponentType(), isDefinition);System.out.print("[]");}}}

运行结果如下



java核心编程中的反射笔记。欢迎评论。



原创粉丝点击