zoukankan      html  css  js  c++  java
  • java 日常学习记录-反射

    Hero类

    package helloworld;
    
    public class Hero {
           public String name; //姓名
             
           public float hp; //血量
             
           public  float armor; //护甲
             
           public int moveSpeed; //移动速度
           
           public void setName(String name) {
               this.name=name;
               }
           
           public String getName() {
               return name;
        }
    }

    目的:读取Hero类属性 赋值,2:读取所有字段打印出类型和名称,3:调用方法

    package helloworld;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    //通过反射修改属性的值 测试类 Hero
    //获取所有属性名称和类型
    //调用方法
    
    /*
         * //getField和getDeclaredField的区别
         * //getField 只能获取public的,包括从父类继承来的字段。
         * //getDeclaredField 可以获取本类所有的字段,包括private的,但是不能获取继承来的字段。
     * */
    public class TestReflection {
        public static void main(String[] argStrings) {
            //传统方式
            Hero hero=new Hero();
            hero.name="测试";
            
            try {
                //获取属性并设置值
                Field field = hero.getClass().getDeclaredField("name");
                //修改这个字段的值
                field.set(hero, "我是java学习的");
                //打印
                System.out.println(hero.name);
                
                //扩展获取所有字段
                Field[] fields = hero.getClass().getDeclaredFields();
                for(int i=0;i<fields.length; i++) {  
                    Field  tempField = fields[i];
                    //属性类型
                    String typeNameString=tempField.getGenericType().toString();
                    String name = tempField.getName();  
                    System.out.println("字段名称:"+name+" 类型:"+typeNameString); 
                }
                
                //调用方法
                Method m=hero.getClass().getMethod("setName", String.class);
                m.invoke(hero, "第一个参数是具体调用的对象 第2个参数是赋值");
                // 使用传统的方式,调用getName方法
                System.out.println(hero.getName());
            }  catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    例子2:通过配置文件获取对象当配置文件里的内容发生变化的时候,就会得到不同的对象。 

    源代码不需要发生任何变化,只需要修改配置文件,就可以导致程序的逻辑发生变化, 这是一种基于配置的编程思想。

    spring 中的IOC和DI的底层就是基于这样的机制实现的(类似的Ling to Sql 也是通过类似的注解(类似net的类 字段上面加上特性) 加上反射 实现)

    新建hero.config文件 内容:helloworld.APHero

    package helloworld;
    
    import java.io.File;
    import java.io.FileReader;
    import java.lang.reflect.Constructor;
    //需求:1:新建 hero.config 内容:helloworld.Hero
    //2:通过反射读取hero.config 文件 取出其中的类名,根据类名实例化出对象
    /*补充
     * 与传统的通过new 来获取对象的方式不同 
        反射机制,会先拿到Hero的“类对象”,然后通过类对象获取“构造器对象” 
        再通过构造器对象创建一个对象
        Spring框架中的IOC和DI的底层就是基于这样的机制实现的。
        获取类对象有3种方式
        1. Class.forName
        2. xxxx.class
        3. new xxxx().getClass()
    */
    public class test {
    
        public static void main(String[] args) {
              Hero h = GetHero();
              System.out.println(h);
        }    
        
        public static Hero GetHero()   {
            try {
                //读取文件,测试学习不做异常(如 文件不存在)判断
                File f = new File("G:\projectJava\hero.config");
                 FileReader fr = new FileReader(f);
                 char[] all = new char[(int) f.length()];
                 fr.read(all);
                 fr.close();
                 String className = String.valueOf(all);
                //反射 
                //得到类名
                 className=new String(all).replaceAll("\s*", ""); //helloworld.APHero helloworld.APHero
                //类对象
                Class<?> cs=Class.forName(className);
                //构造器 
                Constructor<?>  c=cs.getConstructor();        
                //通过构造器实例化
                Hero h= (Hero) c.newInstance();
                return h;
            } catch (Exception e) {
                return null;
            }    
        }
    }
  • 相关阅读:
    API短信平台的部分例子代码(转)
    将你的blog变成英文版
    如何构建安全的.net web应用系统
    利用ASP.NET AJAX实现表格更新程序
    asp.net Futures 之 Dynamic Data Control 的 学习总结
    Java修饰符public,private,protected及默认的区别
    Android之Handler用法总结
    Activity与Service通信(不同进程之间)
    Java关键字this、super使用总结
    Java之模板方法模式(Template Method)
  • 原文地址:https://www.cnblogs.com/y112102/p/10288057.html
Copyright © 2011-2022 走看看