黑马程序员十二、反射

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值