day07_反射

来源:互联网 发布:修图师需要学什么软件 编辑:程序博客网 时间:2024/05/18 16:56

一、原理

简介:

  1. 应用在一些通用性比较高的代码中
  2. 大多数使用反射来实现 框架
  3. 在框架开发中,都是基于配置文件开发的
    在配置文件中,可以通过反射,得到类中的所有内容,可以让类中的某个方法来执行

原理:

  1. 把Java文件保存到本地硬盘 .java
  2. 编译Java文件,成.class文件
  3. 使用JVM,把class文件通过类加载器加载到内存中
  4. class文件在内存中,使用class类来表示对象
  5. 反射:首先,获取class类,其次,得到里面所有内容
  6. 如何获取?
    属性:通过一个类 Filed
    构造方法:通过一个类 Constructor
    普通方法:通过一个类Method

得到class类的3种方式:

  1. 类名.class
  2. 对象.getClass()
  3. 使用Class.forName(“路径”)

二、使用反射操作无参构造方法

//操作无参构造方法@Testpublic void test1() throws Exception {    //得到class    Class c3 = Class.forName("cn.itcast.test06.Person");    //得到Person类的实例    Person p = (Person) c3.newInstance();    p.setId(1500);    System.out.println(p.getId());}

对一个对象实例化,可以new ,不使用new的话,可以如下操作:

//得到class    Class c3 = Class.forName("cn.itcast.test06.Person");    //得到Person类的实例    Person p = (Person) c3.newInstance();

三、使用反射操作有参构造方法

//操作有参构造方法@Testpublic void test2() throws Exception {    //得到class    Class c1 = Class.forName("cn.itcast.test06.Person");    //使用有参构造方法    //c1.getConstructors();//获取所有的构造方法    //穿肚有参数的构造方法里面的参数类型,类型使用class形式传递    Constructor cs = c1.getConstructor(String.class,String.class);    //通过有参数的构造方法,设置值,创建Person实例    Person p1 = (Person) cs.newInstance("jingvjing","100");    System.out.println(p1.getId()+":"+p1.getName());    }

四、使用反射操作name属性

@Test//操作name属性public void test3() throws Exception {    try{//得到class    Class c3 = Class.forName("cn.itcast.test06.Person");    //得到name属性    //c3.getDeclaredFields();//获取所有属性    //得到person实例    Person p11 = (Person)c3.newInstance();    Field f1 = c3.getDeclaredField("name");    //设置可以操作私有属性,不让操作时,使用这个    f1.setAccessible(true);    //设置name值[实例,值]    f1.set(p11, "wujing");    System.out.println(p11.getName());    }catch(Exception e) {        e.printStackTrace();    }}

五、使用反射操作普通方法

//操作方法@Testpublic void test4() throws Exception {//得到class    Class c4 = Class.forName("cn.itcast.test06.Person");    //得到实例    Person p12 = (Person)c4.newInstance();    //得到普通方法    //c4.getDeclaredMethods();//得到所有方法  【方法名,方法值】    Method m1 =c4.getDeclaredMethod("setName", String.class);    //执行setName方法,设置值 【类的实例,设置值】    m1.invoke(p12,"aoao");    System.out.println(p12.getName());  }

反射操作静态方法时,类名.静态方法,不需要实例。代码为:m1.invoke(null,”aoao”);

原创粉丝点击