代码:
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * 反射特点: * 可以在运行期间,动态加载一个类进来,动态new一个对象 * 动态了解对象内部的结构,动态调用这个对象的某一些方法 * 反射好处: * 在配置文件里只写类的名字,可以动态把类加载进来 * @author Administrator * */ public class TestReflection { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{ //String str = "T"; String str = ReadProperties.getClassName(); //把类load到内存,返回Class类型。 Class cls = Class.forName(str); Object o = cls.newInstance(); //new 一个对象 //得到cls类所有的public方法 Method[] methods = cls.getMethods(); /*//读取所有方法名 for(Method m :methods){ System.out.println(m.getName()); }*/ //调用方法 m2 for(Method m :methods){ if(m.getName().equals("m2")){ //可变参数的方法,o是new的对象 m.invoke(o); } if(m.getName().equals("m1")){ //可变参数的方法 m.invoke(o,1,9); //得到m1方法的参数类型 for(Class paramType : m.getParameterTypes()){ System.out.println(paramType.getName()); } } if(m.getName().equals("getS")){ //得到getS方法的返回值类型 Class returnType = m.getReturnType(); System.out.println("getS returnType is :"+returnType); } } } } class T { static{ //测试是否类是否load到内存 System.out.println("T loaded..."); } public T(){ //测试T是否被调用 System.out.println("T constructed..."); } int i; String s; public void m1(int i,int j) { this.i = i+j; System.out.println("i ="+this.i); } public void m2(){ System.out.println("m2 invoked..."); } public String getS() { return s; } }
读取properties配置的代码:
配置文件内容:
Class=T
import java.io.InputStream; import java.util.Properties; public class ReadProperties { static private String className = null; static{ loads(); } synchronized static public void loads(){ if(className == null) { InputStream is = ReadProperties.class.getResourceAsStream("/test.properties"); Properties dbProps = new Properties(); try { dbProps.load(is); className = dbProps.getProperty("Class"); } catch (Exception e) { System.err.println("不能读取属性文件. " + "请确保配置文件在CLASSPATH指定的路径中"); } } } public static String getClassName() { if(className==null) loads(); return className; } }
运行结果:
T loaded...
T constructed...
m2 invoked...
i =10
int
int
getS returnType is :class java.lang.String