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);

 

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

 

posted @ 2015-03-21 23:28  _春夏秋冬  阅读(651)  评论(1编辑  收藏  举报