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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© chslzj 中级黑马   /  2013-7-6 11:40  /  1112 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 chslzj 于 2013-7-6 11:46 编辑

toString方法没有参数,只有调用对象 我这样得到方法 Method toStringMethod=Class.forName(className).getMethod("toString");
当这样调用方法时,却没有输出
toStringMethod.invoke(point1);
下面是整个的源码里面的className是ReflectPoint,程序结果是:
2
3
1
2
  1. /**
  2. *
  3. */
  4. package com.itheima.test;

  5. import java.io.FileInputStream;
  6. import java.io.InputStream;
  7. import java.lang.reflect.Constructor;
  8. import java.lang.reflect.Field;
  9. import java.lang.reflect.Method;
  10. import java.util.Properties;

  11. /**
  12. * @author Administrator
  13. *
  14. */
  15. public class ReflectTest{
  16.         public static void main(String[] args) throws Exception {
  17.                 InputStream ips=new FileInputStream("config.properties");//从文件中读取类名
  18.                 Properties pro=new Properties();
  19.                 pro.load(ips);
  20.                 ips.close();
  21.                 String className=pro.getProperty("className");
  22.                 //得到构造方法
  23.                 Constructor constructor=Class.forName(className).getConstructor(int.class,int.class);
  24.                 //使用构造方法得到对象
  25.                 ReflectPoint point1=(ReflectPoint)constructor.newInstance(1,2);
  26.                 ReflectPoint point2=(ReflectPoint)constructor.newInstance(2,3);
  27.                 //得到类中成员变量x对于的类
  28.                 Field fieldY=Class.forName(className).getField("y");
  29.                 //输出对象point1,point2对应的y的值
  30.                 System.out.println(fieldY.get(point1));
  31.                 System.out.println(fieldY.get(point2));
  32.                 //得到类中成员变量x对于的类
  33.                 //Field fieldX=Class.forName(className).getField("x");
  34.                 //对于private的变量不能直接用getField来得到成员变量,应该使用getDeclaredField
  35.                 Field fieldX=Class.forName(className).getDeclaredField("x");
  36.                 //输出对象point1,point2对应的x的值
  37.                 //因为x还是private,不能直接读取,要设置权限
  38.                 fieldX.setAccessible(true);
  39.                 System.out.println(fieldX.get(point1));
  40.                 System.out.println(fieldX.get(point2));
  41.                 //下面更改point1中String类型的值,长度如果大于4,就截断
  42.                 Field[] fields=Class.forName(className).getFields();
  43.                 //这里先把toString方法用反射的方式得到
  44.                 Method toStringMethod=Class.forName(className).getMethod("toString");
  45.                 toStringMethod.invoke(point1);
  46.                
  47.                 for(Field field:fields)
  48.                         if(field.getType()==String.class)//字节码用==判断
  49.                         {
  50.                                 String oldValue=(String)field.get(point1);
  51.                                 String newValue=oldValue.substring(0, 4);
  52.                                 field.set(point1, newValue);
  53.                         }
  54.                 toStringMethod.invoke(point1);
  55.                         
  56.         }
  57. }
  58. class ReflectPoint {
  59.         private int x;
  60.         public int y;
  61.         public String str1 = "football";
  62.         public String str2 = "basketball";
  63.         public String str3 = "itcast";
  64.         
  65.         public ReflectPoint(int x, int y) {
  66.                 super();
  67.                 this.x = x;
  68.                 this.y = y;
  69.         }
  70.         /* (non-Javadoc)
  71.          * @see java.lang.Object#toString()
  72.          */
  73.         @Override
  74.         public String toString() {
  75.                 return str1+":"+str2+":"+str3;
  76.         }
  77. }
复制代码

评分

参与人数 1技术分 +1 黑马币 +2 收起 理由
神之梦 + 1 + 2 很给力!

查看全部评分

2 个回复

倒序浏览
好吧,我错了,竟然没有写输出。。
回复 使用道具 举报
chslzj 发表于 2013-7-6 11:46
好吧,我错了,竟然没有写输出。。

看来楼主对反射理解得很透彻了,欢迎多来论坛交流
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马