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

  • 相关阅读:
    Vue基础知识总结(一)
    D3.js系列——布局:弦图和集群图/树状图
    D3.js系列——布局:饼状图和力导向图
    D3.js系列——交互式操作和布局
    SQLServer调试
    SQL Server性能常用语句
    sqlserver索引
    从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值
    EntityFrame6在本地可以正常使用,部署到IIS后报异常(Additional information: The underlying provider failed on Open.)
    从对象创建和引用小议解耦
  • 原文地址:https://www.cnblogs.com/lihaoyang/p/4872032.html
Copyright © 2011-2022 走看看