zoukankan      html  css  js  c++  java
  • java学习之 反射

    以前学习java只是学习了基本语法操作,各种常用方法的使用,随着慢慢学习,很多大神都觉得要想成为大神,就必须把java的反射给理解透,这样我就带着好奇的心去学习到底反射是什么玩意,所以就上网找资料学习去了,没想到收获真的不小,其实我们平时用的跟多操作都是通过反射来完成的,比如对于servlet在web.xml的配置都是同过反射来新建一个对象,还有SSH都是通过反射来实例化对象的,通过了反射让我更好的理解SSH框架。下面小弟就开始小谈一下反射的详细内容吧, 由于本人水平有限若文章在表述和代码方面如有不妥之处,欢迎批评指正。留下你的脚印,欢迎评论!希望能互相学习。

    反射其实就是通过Class对象获取类型的相关信息;

    与反射相关的类

    1: Class:表示类;

    2: Field:表示成员变量;
    3: Method:表示方法;
    4: Constructor:表示构造器

    1:class类:获取class类的话有三种方法

    如定义一个Users类

    public class Users {
        private Integer Id;
        private String Name;
        private Date Birth;
        private float Score;
    
        public Integer getId() {
            return Id;
        }
    
        @Override
        public String toString() {
            return "Users [Id=" + Id + ", Name=" + Name + ", Birth=" + Birth
                    + ", Score=" + Score + "]";
        }
    
        public Users() {
        }
    
        public Users(int id) {
            this.Id = id;
        }
    
        public void setId(Integer id) {
            Id = id;
        }
    
        public String ResultStr() {
            return "str";
        }
    
        public String getName() {
            return Name;
        }
    
        public void setName(String name) {
            Name = name;
        }
    
        public Date getBirth() {
            return Birth;
        }
    
        public void setBirth(Date birth) {
            Birth = birth;
        }
    
        public float getScore() {
            return Score;
        }
    
        public void setScore(float score) {
            Score = score;
        }
    }


    那么可以通过三种方式来获取该类

    Usersp = new Users();
      // 获取类的三种方法
    
      Class c2 = p.getClass();//新建一个对象是再获取该类
      Class c1 = Users.class;//直接通过类的静态方法来获取该类
      Class c3 = Class.forName("com.lishun.Peason");//通过包名和类名来获取该类(配置文件就是通过这种方式来获取实例)

    获取到了类就可以获取该类的构造器,方法和成员了(这里就使用上面的第三种方法获取类实例)

    1:获取构造器:Constructor

    Class c3 = Class.forName("com.lishun.Peason");//
      //获取本类和父类一个公有构造器
      Constructor cPublic=c3.getConstructor(int.class);//int.class指的的含有一个int类型参数的构造器
      //获取本类和父类所有公有构造器
      Constructor[] cPublicAll=c3.getConstructors();
      
      //获取本类一个私有或公有构造器
      Constructor cPublicOrPrivaet=c3.getDeclaredConstructor();
      //获取本类所有公有或私有的构造器
      Constructor[] cPublicOrPrivaetAll=c3.getDeclaredConstructors();
      
      //执行构造方法
      Peason p=(Peason)cPublic.newInstance(1);

    2:获取方法:Method

     //获取本类和父类单个公有的方法
       Method m=c3.getMethod("ResultStr");
       //获取本类和父类所有的公有的方法
       Method[] mall=c3.getMethods();
       
       //获取本类单个公有或私有的方法(所有访问级别都可获取到)
       Method m1=c3.getDeclaredMethod("ResultStr1",String.class);
       //获取本类所有的公有或私有的方法(所有访问级别都可获取到)
       Method[] mall1=c3.getDeclaredMethods();
       
       //执行该方法
       m.invoke(c3.newInstance());//若执行静态的方法,第一个参数为null 无需新的对象

    3:成员:Field
      

     //获取本类和父类单个公有的方法
       try {
        Field f = c3.getField("Name");
       } catch (Exception e) {
        System.out.println(e.getMessage());
       }
       //获取本类和父类所有的公有的方法
       Field[] fall=c3.getFields();
       
       //获取本类单个公有或私有的成员(所有访问级别)
       Field f1=c3.getDeclaredField(Name");
       //获取本类所有的公有或私有的方法(所有访问级别)
       Field[] fall1=c3.getDeclaredFields();
       Object o=c3.newInstance();
       //给成员赋值,private成员,方法,构造器 默认都是不能赋值的
       f1.setAccessible(true);//把private的成员设置为可用
       f1.set(o, "lishun");
       System.out.println(o);

    好了我所理解的反射就这些了,,小弟在此若还有没提全的或有错误的,望各位大神们指正出来,我也是个在学习中的小菜鸟,,希望能学得到更多的技术知识

  • 相关阅读:
    EditorWindow 和MenuItem
    PropertyDrawer 自定义属性绘图
    NGUI3.5系列教程之 一些小功能的实现
    NGUI3.5系列教程之 UILabel
    关于Resources.LoadAssetAtPath
    C#调用Python 脚本语言
    unity项目实现“再按一次退出程序”提示功能
    在Visual Studio 2010 中创建类库(dll)
    Unity 优化
    JAVA package-info文件【转】
  • 原文地址:https://www.cnblogs.com/lishun1005/p/4356538.html
Copyright © 2011-2022 走看看