/* * 反射:运行时获取一个类的信息。JavaBean使用它分析一个组件的功能,也可以通过反射 * 调用方法或构造器 * java.lang.Class 包装了 java.lang.reflect包中的API。 * * 涉及的类和方法: * java.lang.Class<T> * static Class<?> forName(String name)throws ClassNotFoundException * Constructor<?>[] getDeclaredConstructors()throws SecurityException * //说明:对接口,数组,基本类型或void使用这个方法,返回0长度数组 * Field[] getDeclaredFields()throws SecurityException * Field[] getFields() throws SecurityException * Method[] getDeclaredMethods()throws SecurityException * Method[] getMethods() throws SecurityException * java.lang.reflect.Constructor<T> * java.lang.reflect.Field * java.lang.reflect.Method */ import java.lang.reflect.*; class MyCount{ private int count; public MyCount(){ this(0); } public MyCount(int count){ this.count = count; } public int getCount() { return count; } public void setCount(int count) { this.count = count; } public void show(){ System.out.println("--------" + count); } public String toString(){ return "the count is " + count; } } public class ReflectionDemo { public static void main(String[] args) throws Exception{ //运行时从类获取信息 //Class c = Class.forName("com.dxw.jdk15.MyCount"); //使用类字面量获取Class对象 Class c = MyCount.class; //运行时从对象获取 //Integer integer = new Integer(2); //Class c = integer.getClass(); System.out.println("----------构造器--------"); Constructor constructors[] = c.getDeclaredConstructors(); for(Constructor cons : constructors) System.out.println(cons); System.out.println("----------方法--------"); Method methods[] = c.getDeclaredMethods(); for(Method meth : methods) System.out.println(meth); System.out.println("----------字段--------"); Field fields[] = c.getDeclaredFields(); for(Field fld : fields) System.out.println(fld); } } /* *反射的重要价值:运行时动态创建对象、调用方法 */ import java.lang.reflect.*; public class ReflectionDemo2 { public static void main(String[] args)throws Exception{ Class c = Class.forName("com.dxw.jdk15.MyCount"); Constructor constructors[] = c.getDeclaredConstructors(); Object obj = null; for(Constructor cons : constructors) { //获取构造器参数的数据类型信息 Class[] params = cons.getParameterTypes(); //调用一个参数且参数类型是int的构造器 if(params.length == 1 && params[0] == int.class) { obj = cons.newInstance(10); break; } } if(obj==null){ System.out.println("不能创建对象"); return; } System.out.println("创建对象完成。。。。。"); Method[] methods = c.getDeclaredMethods(); for(Method meth : methods){ //获取方法参数类型信息 Class[] params = meth.getParameterTypes(); if(params.length == 1 && params[0]==int.class){ meth.invoke(obj, 25);//调用一个参数的方法 }else if(params.length==0){ if(meth.getReturnType()==int.class){ Object re = meth.invoke(obj);//调用无参数的方法 System.out.println(re); }else if(meth.getReturnType()==void.class){ meth.invoke(obj);//调用无参数无返回值的方法 } } } } } 通过反射调用私有函数 import java.lang.reflect.Field; import java.lang.reflect.Method; class A{ private int i=10; private void printI(){ System.out.println("i=" + i); } private void printI(int x){ System.out.println("i=" + i + x); } } public class Test { public static void main(String[] args)throws Exception{ A a = new A(); Class cl = a.getClass(); Method[] methods = cl.getDeclaredMethods(); for(Method x : methods){ System.out.println(x); } Method m1 = cl.getDeclaredMethod("printI"); Method m2 = cl.getDeclaredMethod("printI",int.class);//获取带参数的printI m1.setAccessible(true); m2.setAccessible(true); m1.invoke(a); m2.invoke(a,20); } }