zoukankan      html  css  js  c++  java
  • java反射机制_读取properties

    代码:

    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

  • 相关阅读:
    快速找到由程序员到CTO发展道路上的问路石
    从大师身上反思
    你真的了解企业虚拟化吗?
    “驱网核心技术丛书”创作团队访谈
    程序员到CTO需要准备什么
    深入搜索引擎的关键——索引
    程序员到CTO必须注意的几个关键点
    微软全球MVP教你如何规划程序人生
    “碟中碟”虚拟光驱软件开发者——万春 读《寒江独钓——Windows内核安全编程 》有感
    常用jar包之commonscollection使用
  • 原文地址:https://www.cnblogs.com/lihaoyang/p/4872032.html
Copyright © 2011-2022 走看看