代码:

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;
    }
}
View Code

读取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;
 }
 
}
View Code

运行结果:

T loaded...
T constructed...
m2 invoked...
i =10
int
int
getS returnType is :class java.lang.String

 

 欢迎关注个人公众号一起交流学习: