• 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

  • 相关阅读:
    JS通过组装key值访问json对象中的值
    js属性对象的hasOwnProperty方法
    ES6 去掉已经 new Date().format 方法
    Ajax不能接受php return值的原因
    CentOS最常用命令及快捷键整理
    js中for循环中需要调用异步方法,怎么确保执行的顺序?
    MYSQL 更新字段,向字段追加字符串
    java-学习2
    java-学习1
    JS----贪吃蛇游戏
  • 原文地址:https://www.cnblogs.com/lihaoyang/p/4872032.html
Copyright © 2020-2023  润新知