黑马程序员技术交流社区

标题: 黑马入学测试6 [打印本页]

作者: nagi    时间: 2014-9-21 15:13
标题: 黑马入学测试6

定义一个标准的JavaBean,名叫Person,包含属性name、age。使用反射的方式创建一个实例、调用构造函数初始化name、age,使用反射方式调用setName方法对名称进行设置,不使用setAge方法直接使用反射方式对age赋值。

答:分析

1、建立Person Bean  并且复写toString() 方法

2、通过反射Person 构造方法为属性name age 赋值

3、通过反射Person Method中的setName的方法为name 赋值

4、通过反射Person Field 中age 为age
package com.itheima;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* 定义一个标准的JavaBean,名叫Person,包含属性name、age。
* 使用反射的方式创建一个实例、调用构造函数初始化name、age,
* 使用反射方式调用setName方法对名称进行设置,不使用setAge方法直接使用反射方式对age赋值。
*  
*  分析:
*   1、建立Person Bean  并且复写toString() 方法
*   2、通过反射Person 构造方法为 属性name age 赋值
*   3、通过反射Person Method中的setName的方法为name 赋值
*   4、通过反射Person Field 中age 为age 赋值
* @author dell
*
*/
public class Test7 {

public static void main(String[] args) {
  
  Test7 test = new Test7();
  
  test.setName();
  
  test.setAge();
  
}
public Test7() {
  try {
   // 加载类
   @SuppressWarnings("unchecked")
   Class<Person> pclazz = (Class<Person>) Class.forName("com.itheima.Person");
   
   // 加载构造方法
   Constructor<Person> constructor = pclazz.getConstructor(String.class, int.class);
   
   Person person = (Person) constructor.newInstance("黑马", 21);
   
   System.out.println(person);
  } catch (Exception e) {
   
   e.printStackTrace();
  }
}
/**
  * 使用反射方式调用setName方法对名称进行设置
  */
public void setName() {
  try {
   // 加载类
   @SuppressWarnings("unchecked")
   Class<Person> pclazz = (Class<Person>) Class.forName("com.itheima.Person");
   
   // 加载构造方法
   Constructor<Person> constructor = pclazz.getConstructor();
   
   //构成出一个person 对象
   Person person = (Person) constructor.newInstance(null);
   
   //得到setName 方法
   Method method = pclazz.getMethod("setName", String.class);
   
   //设置姓名值
   method.invoke(person, "黑马");
   
   //打印出person值
   System.out.println(person);
   
  } catch (Exception e) {
   
   e.printStackTrace();
  }
}
/**
  * 不使用setAge方法直接使用反射方式对age赋值
  */
public void setAge() {
  try {
   // 加载类
   @SuppressWarnings("unchecked")
   Class<Person> clazz = (Class<Person>) Class.forName("com.itheima.Person");
   
   // 加载构造方法
   Constructor<Person> constructor = clazz.getConstructor();
   
   Person person = (Person) constructor.newInstance(null);
   
   // 得到想操作的字段
   Field a = clazz.getDeclaredField("age");
   
   // 允许反射私有方法。。
   a.setAccessible(true);
   
   // 获取字段类型。。
   Class type = a.getType();
   
   if (type.equals(int.class)) {
    // 设置年龄值
    a.set(person, 21);
   }
   //打印出person值
   System.out.println(person);
   
  } catch (Exception e) {
   
   e.printStackTrace();
  }
}
}
package com.itheima;
public class Person {
private String name;
private int age;
public String getName() {
  return name;
}
public void setName(String name) {
  this.name = name;
}
public int getAge() {
  return age;
}
public void setAge(int age) {
  this.age = age;
}
public Person(String name, int age) {
  super();
  this.name = name;
  this.age = age;
}
public Person() {
  super();
}
@Override
public String toString() {
  return "Person: Name:\t" + name + "\t Age:\t" + age;
}
}


作者: zhiyuan0932    时间: 2014-9-22 02:27
啊啊!难度不小!
作者: 不系之舟王    时间: 2014-9-22 07:21
入学测试好难啊
作者: 不轻易    时间: 2014-9-22 08:39
看着确实感觉有些难度呢~~
作者: zhappy    时间: 2014-9-22 08:45
好像挺难的
作者: nagi    时间: 2014-9-24 10:53
zhappy 发表于 2014-9-22 08:45
好像挺难的

算简单的,,
作者: nagi    时间: 2014-9-24 10:54
zhiyuan0932 发表于 2014-9-22 02:27
啊啊!难度不小!

你应该已经进入黑马了吧!
作者: 黑马的小菜鸟    时间: 2014-9-24 11:08
我要加把劲了!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2