A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

不多说,先上实例
  1. /**
  2. * 描述人的类
  3. * @author Administrator
  4. *
  5. */
  6. public class Person{
  7.         private String name;//姓名
  8.         private int age;//年龄
  9.         public Person(){}
  10.         public Person(String name,Integer age){//带参的构造函数
  11.                 this.name=name;
  12.                 this.age=age;
  13.         }
  14.        
  15.         /**
  16.          * 获得姓名
  17.          * @return
  18.          */
  19.         public String getName() {
  20.                 return name;
  21.         }
  22.         /**
  23.          * 修改姓名
  24.          * @param name
  25.          */
  26.         public void setName(String name) {
  27.                 //System.out.println("setName");
  28.                 this.name = name;
  29.         }
  30.         /**
  31.          * 获得年龄
  32.          * @return
  33.          */
  34.         public int getAge() {
  35.                 return age;
  36.         }
  37.         /**
  38.          * 修改年龄
  39.          * @param age
  40.          */
  41.         public void setAge(int age) {
  42.                 this.age = age;
  43.         }
  44.        
  45. }
复制代码

  1. public class Test {

  2.         public static void main(String[] args) {
  3.                 //获得该类的字节码文件对象
  4.                 try {
  5.                         Class clazz=Class.forName("com.itheimas.Person");
  6.                         //获得对象的构造器
  7.                         Constructor constructor=clazz.getConstructor(String.class,Integer.class);
  8.                         //通过构造器创建实例
  9.                         Object obj=constructor.newInstance("张三",23);
  10.                         //Object obj=clazz.newInstance();
  11.                         //使用反射方式调用setName方法对名称进行设置
  12.                         Method method=clazz.getMethod("setName",String.class);
  13.                         //反射的方法调用
  14.                         method.invoke(obj,"李四");
  15.                        
  16.                         //不使用setAge方法直接使用反射方式对age赋值
  17.                         Field field=clazz.getDeclaredField("age");//获得年龄属性,并包装成发射对象
  18.                         field.setAccessible(true);//暴力访问
  19.                         field.set(obj,30);
  20.                         System.out.println(field.get(obj));
  21.                        
  22.                 } catch (ClassNotFoundException e) {
  23.                         // TODO Auto-generated catch block
  24.                         System.out.println("没有发现该类");
  25.                 } catch (SecurityException e) {
  26.                         // TODO Auto-generated catch block
  27.                         e.printStackTrace();
  28.                 } catch (NoSuchMethodException e) {
  29.                         // TODO Auto-generated catch block
  30.                         e.printStackTrace();
  31.                 } catch (IllegalArgumentException e) {
  32.                         // TODO Auto-generated catch block
  33.                         e.printStackTrace();
  34.                 } catch (InstantiationException e) {
  35.                         // TODO Auto-generated catch block
  36.                         e.printStackTrace();
  37.                 } catch (IllegalAccessException e) {
  38.                         // TODO Auto-generated catch block
  39.                         e.printStackTrace();
  40.                 } catch (InvocationTargetException e) {
  41.                         // TODO Auto-generated catch block
  42.                         e.printStackTrace();
  43.                 } catch (NoSuchFieldException e) {
  44.                         // TODO Auto-generated catch block
  45.                         e.printStackTrace();
  46.                 }
  47.         }
  48. }
复制代码

问题是:在Person类中,有参构造器参数里面必须定义引用类型变量才能在反射中找到这个构造函数么?

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马