黑马程序员技术交流社区

标题: 学习视频教程中遇到的一个关于反射的例子 [打印本页]

作者: 唐志兵    时间: 2012-6-9 20:03
标题: 学习视频教程中遇到的一个关于反射的例子
本帖最后由 唐志兵 于 2012-6-9 20:05 编辑
  1. import java.lang.reflect.Field;


  2. public class ReflectTest2 {
  3. public static void main(String[] args) throws Exception {
  4. changeString();
  5. }

  6. private static void changeString() throws Exception {
  7. // TODO Auto-generated method stub
  8. ReflectPoint rp = new ReflectPoint(5, 6);
  9. Field[] fields = rp.getClass().getFields();

  10. for (Field field : fields) {
  11. if (field.getType() == String.class) {
  12. //比较两份字节码是否相同,所以要用 == 而不用 equals
  13. //问题在这里:   field.getType和 field.getClass返回的都是Class,它们有什么区别呢?  
  14. String strOld = (String) field.get(rp);


  15. 怎么我把代码粘贴上来,前面的空格就没了呢,这样看太乱了。
  16. String strNew = strOld.replace("b", "hi,");
  17. field.set(rp, strNew);
  18. }
  19. }
  20. System.out.println(rp);
  21. }
  22. }

  23. class ReflectString {
  24. public String str1 = "bhaoma";
  25. public String str2 = "bnihao";
  26. public String str3 = "bwobuhao";


  27. public String toString() {
  28. return str1 +":" + str2 + ":" + str3;
  29. }
  30. }
复制代码

作者: 信义明    时间: 2012-6-9 20:25
Type 是 Java 编程语言中所有类型的公共高级接口。它们包括原始类型、参数化类型、数组类型、类型变量和基本类型。
而Class类实现了Type接口
field.getType()是返回一个 Class 对象,它标识了此 Field 对象所表示字段的声明类型。
我在api里没有查到field有getClass()方法
作者: 梁小波    时间: 2012-6-9 20:27
首先。getType()是Field的对象的方法;也就是一个对象字段获得class字节码的方法!
而getClass()是对象获得字节码的方法;也就是field是没有getclass()的!
作者: 唐志兵    时间: 2012-6-9 20:28
那个 getClass()方法是继承而来的。
作者: 赵兵锋    时间: 2012-6-9 20:36
API:
public Class<?> getType()返回一个 Class 对象,它标识了此 Field 对象所表示字段的声明类型。
返回:标识此对象所表示字段的声明类型的 Class 对象
public final Class<?> getClass()返回此 Object 的运行时类。返回的 Class 对象是由所表示类的 static synchronized 方法锁定的对象。
实际结果类型是 Class<? extends |X|>,其中 |X| 表示清除表达式中的静态类型,该表达式调用 getClass。 例如,以下代码片段中不需要强制转换:
Number n = 0;
Class<? extends Number> c = n.getClass();
  1. public class Main extends TT{
  2.         public String nn ;
  3.         public static void main(String[] args) throws SecurityException, NoSuchFieldException {
  4.                 TT m = new Main();
  5.                 System.out.println(m.getClass());//尽管其引用类型是TT,但其实际上是Main类型。即运行时类。
  6.                 System.out.println(m.getClass().getField("nn"));
  7.         }
  8. }
  9. class TT{
  10.         public int nn;
  11. }
复制代码
输出:
class Main
public java.lang.String Main.nn





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