天天看点

黑马程序员十二、反射

----------- android培训、java培训、期待与您交流! ------------

一个类有多个组成部分,例如:成员变量,方法,构造方法等。反射就是加载类,并解剖出各个组成部分。(反射技术用于框架中)

1) 加载类,获得类的字节码。

    (1)  Classclass  = Class.forName(“person”);

    (2)  Class class1 = new Person.getClass();

    (3)  Classclass2 = Person.class;

2) 反射类的构造函数,创建类的对象。

public class Person {

     public String name = "zhangsan";

      public Person(){

          System.out.println("person");

      }

      public Person(String name){

          System.out.println("person name");

     }

     public Person(String name, int password){

          System.out.println("person name password");

     }

     private Person(List list){

          System.out.println("list");

    }

   //-----类的方法------

    public void show(){

       System.out.println("show");

     }

public void show(String name, int password){

      System.out.println(name+":"+password);

}

public Class[] show(String name, int[] password){

          return new Class[] {String.class};

}

private void show(InputStream in){

        System.out.println(in);

}

public static void show(int num){ 

System.out.println(num);

}

}

public class Demo1 {

// 反射无参构造函数    (以下都在JUnite下执行)

@Test

public void test1() throws Exception {

Class clazz = Class.forName("com.java.enhance.Person");

Constructor c = clazz.getConstructor(null);

Person p = (Person) c.newInstance(null);  //创建实例对象,

System.out.println(p.name);

}

// 反射有参构造函数

@Test

public void test2() throws Exception {

Class clazz = Class.forName("com.java.enhance.Person");

Constructor c = clazz.getConstructor(String.class);

Person p = (Person) c.newInstance("heima");

System.out.println(p.name);

}

// 反射多参构造函数

@Test

public void test3() throws Exception {

Class clazz = Class.forName("com.java.enhance.Person");

Constructor c = clazz.getConstructor(String.class, int.class);

Person p = (Person) c.newInstance("heima", 20);

System.out.println(p.name);

}

// 反射私有构造函数

@Test

public void test4() throws Exception {

Class clazz = Class.forName("com.java.enhance.Person");

Constructor c = clazz.getDeclaredConstructor(List.class);

c.setAccessible(true); // 由于构造方法私有不能访问,暴力反射

Person p = (Person) c.newInstance(new ArrayList());

System.out.println(p.name);

}

}

3)反射类的方法  

       a.Method类代表某个类中的一个成员方法

b. 得到类中的某一个方法

例: Method charAt = Class.forName("java.lang.String").getMethod("charAt".int.class);

c.调用方法

通常方式::System.out.println(str.charAt(1));

反射方式:System.out.println(charAt.invoke(str,1));

注意:如果传递给Method对象的invoke()方法的第一个参数为null,则说明该Method对象对应的是一个静态方法。

public class PersonDemo2 {

@Test

public void test1() throws Exception {

Person p = new Person();

Class clazz = Class.forName("com.java.enhance.Person"); //加载类

Method method = clazz.getMethod("show", null); // 得到类中的某一个方法

method.invoke(p, null); //调用方法

}

// 反射的方法:public void show(String name, int password)

@Test

public void test2() throws Exception {

Person p = new Person();

Class clazz = Class.forName("com.java.enhance.Person");

Method method = clazz.getMethod("show", String.class, int.class);

method.invoke(p, "zxx", 36);

}

// 反射的方法:public Class[] show(String name,int[] password)

@Test

public void test3() throws Exception {

Person p = new Person();

Class clazz = Class.forName("com.java.enhance.Person");

Method method = clazz.getMethod("show", String.class, int[].class);

Class cs[] = (Class[]) method.invoke(p, "xyz", new int[] { 1, 2, 3 });

System.out.println(cs[0]);

}

// 反射类静态的方法,传递给Method对象的invoke()方法的第一个参数为null

@Test

public void test5() throws Exception {

Class clazz = Class.forName("com.java.enhance.Person");

Method method = clazz.getMethod("show", int.class);

method.invoke(null, 12);

}

}

4)反射类的字段

Field类代表某个类中的一个成员变量

@Test

public void test1() throws Exception {

Person p = new Person();

Class clazz = Class.forName("com.java.enhance.Person");

Field f = clazz.getField("name");

Object value = f.get(p); // String name = (String)f.get(p);

// 获取字段的类型

Class type = f.getType();

if (type.equals(String.class)) {

String svalue = (String) value;

System.out.println(svalue);

}

// 设置字段的值

f.set(p, "yyyy");

System.out.println(p.name);

}

----------------------- android培训、java培训、java学习型技术博客、期待与您交流! ----------------------

详情请查看:http://edu.csdn.net/heima