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

  • 相关阅读:
    FPGA STA(静态时序分析)
    Github实例教程-创建库、创建主页
    【JS】两种计时器/定时器
    【java】 获取计算机信息及Java信息
    【java 上传+下载】
    【POI xls】解析xls遇到的问题
    【jackson 异常】com.fasterxml.jackson.databind.JsonMappingException异常处理
    【tomcat 无法部署】svn上下载的maven项目无法部署到tomcat中
    【jQuery 冻结任意行列】冻结任意行和列的jQuery插件
    【JSON 注解】JSON循环引用2----JSON注解@JsonIgnoreProperties+JAVA关键字transient+后台对象与JSON数据的格式互相转化
  • 原文地址:https://www.cnblogs.com/lihaoyang/p/4872032.html
Copyright © 2011-2022 走看看