java反射机制示例与分析
Java反射机制通过JVM运行时动态获取类信息以及动态调用对象的方法。其实反射并不像我们想象的那么神秘,复杂。它通过java.lang.Class以及java.lang.reflect包的API实现的反射功能。我们在Spring AOP,JDBC数据库加载驱动都有用到反射机制。下面通过几段代码示例看看reflection究竟是如何工作的。
package com.me.reflection;import java.lang.reflect.*;public class DumpMethods { public static void main(String args[]) { try { Class c = Class.forName("java.lang.String"]);//1 Method m[] = c.getDeclaredMethods(); for (int i = 0; i < m.length; i++) System.out.println(m[i].toString()); } catch (Throwable e) { System.err.println(e); } }}package com.me.reflection;import java.lang.reflect.*;public class MethodDemo { private int f1(Object p, int x) throws NullPointerException { if (p == null) throw new NullPointerException(); return x; } public static void main(String args[]) { try { Class cls = Class.forName("com.me.reflection.MethodDemo");//获得指定类的所有方法。通过getMethods()返回指定类所有公共方法 Method methlist[] = cls.getDeclaredMethods(); for (int i = 0; i < methlist.length; i++) { Method m = methlist[i]; System.out.println("name = " + m.getName()); System.out.println("decl class = " + m.getDeclaringClass());//获得每个方法的参数类型类表数组 Class pvec[] = m.getParameterTypes(); for (int j = 0; j < pvec.length; j++) System.out.println("param #" + j + " " + pvec[j]); } } catch (Throwable e) { System.err.println(e); } }}package com.me.reflection;import java.lang.reflect.*;public class ConstructorDemo { public ConstructorDemo () { } protected ConstructorDemo (int i, double d) { } public static void main(String args[]) { try { Class cls = Class.forName("com.me.reflection.ConstructorDemo");//获得指定类的所有构造方法。通过getConstructors()返回指定类所有公共构造方法 Constructor ctorlist[] = cls.getDeclaredConstructors(); for (int i = 0; i < ctorlist.length; i++) { Constructor ct = ctorlist[i]; System.out.println("name = " + ct.getName()); System.out.println("decl class = " + ct.getDeclaringClass());//获得每种构造方法的参数类型类表数组 Class pvec[] = ct.getParameterTypes(); for (int j = 0; j < pvec.length; j++) System.out.println("param #" + j + " " + pvec[j]); } } catch (Throwable e) { System.err.println(e); } }}package com.me.reflection;import java.lang.reflect.*;public class FieldDemo{ private double d; public static final int i = 37; String s = "testing"; public static void main(String args[]) { try { Class cls = Class.forName("com.me.reflection.FieldDemo"); Field fieldlist[] = cls.getDeclaredFields(); for (int i = 0; i < fieldlist.length; i++) { Field fld = fieldlist[i]; System.out.println("name = " + fld.getName()); System.out.println("decl class = " + fld.getDeclaringClass()); System.out.println("type = " + fld.getType()); int mod = fld.getModifiers(); System.out.println("modifiers = " + Modifier.toString(mod)); System.out.println("-----"); } } catch (Throwable e) { System.err.println(e); } }}package com.me.reflection;import java.lang.reflect.*;public class ReflectionApp { public ReflectionApp(){} public ReflectionApp(int a,int b){ System.out.println("a = " + a + " b = " + b); } public int add(int a, int b) { return a + b; } public static void main(String args[]) { try { Class cls = Class.forName("com.me.reflection.ReflectionApp"); Class partypes[] = new Class[2]; partypes[0] = Integer.TYPE; partypes[1] = Integer.TYPE;//创建类对象 如果指定类只有默认构造方法,我们可通过cls.newInstance()直接生成类对象,只有Class和Constructor这两个类可以直接生成类对象 Constructor ct = cls.getConstructor(partypes); Object arglist[] = new Object[2]; arglist[0] = new Integer(37); arglist[1] = new Integer(47);[color=red]//注意:Class#getConstructor和Constructor#newInstance方法参数类型是一致的[/color] ReflectionApp ra = (ReflectionApp)ct.newInstance(arglist);//获得指定类指定方法 Method meth = cls.getMethod("add", partypes);//动态调用类方法:通过invoke(指定类对象,方法参数类型列表)方法 Object retobj = meth.invoke(ra, arglist); Integer retval = (Integer) retobj; System.out.println(retval.intValue()); } catch (Throwable e) { System.err.println(e); } }}