黑马程序员技术交流社区

标题: 反射问题 [打印本页]

作者: funneies    时间: 2013-8-19 13:13
标题: 反射问题
本帖最后由 funneies 于 2013-8-19 14:18 编辑

想遍历一下构造方法,但是使用forName方式得到的Class对象运行时,会跳过foreach遍历,没有结果显示,想知道为什么?

复制代码

复制代码
  1. package day06.enhance;

  2. public class ReflectPoint {

  3.         private int x;
  4.         public int y;
  5.         public String str1 = "ball";
  6.         public String str2 = "basketball";
  7.         public String str3 = "itcast";
  8.         public ReflectPoint(int x, int y) {
  9.                 super();
  10.                 this.x = x;
  11.                 this.y = y;
  12.         }
  13.         @Override
  14.         public String toString(){
  15.                 return "str1:"+str1+"str2:"+str2+"str3:"+str3;
  16.         }
  17. }

  18. package day06.enhance;

  19. import java.lang.reflect.Constructor;
  20. import java.lang.reflect.Field;

  21. public class ReflectTest {
  22.         public static void main(String []args) throws Exception{
  23.                 Class clazz = Class.forName("day06.enhance.ReflectPoint").getClass();
  24.                 Class clazz1 = ReflectPoint.class;
  25.                 ReflectPoint pt1 = new ReflectPoint(3,5);
  26.                 Class clazz2 = pt1.getClass();
  27.                 Constructor[] constructors = clazz2.getConstructors();//此处使用clazz时,没有显示,使用clazz2时显示正常。
  28.                 Constructor constructor = Class.forName("java.lang.String").getConstructor(StringBuffer.class);
  29.                 String str = (String)constructor.newInstance(new StringBuffer("abc"));
  30.                 System.out.println(str.charAt(2));
  31.                 for (Constructor constructor2 : constructors) {
  32.                         System.out.println(constructor2);
  33.                 }

  34.         }
  35. }
复制代码
运行结果:
c
public day06.enhance.ReflectPoint(int,int)




作者: 刘张朋    时间: 2013-8-19 14:09
问题在28行:
Class clazz = Class.forName("day06.enhance.ReflectPoint").getClass();
forName方法本身得到的就是一个字节码,你在对得到的(ReflectPoint的)字节码获取字节码,按逻辑算得到的应该是Calss类的字节码了,据我了解Class类是没有构造方法的哈。
作者: funneies    时间: 2013-8-19 14:15
哈哈,谢谢了,自己太不仔细了。
作者: 刘张朋    时间: 2013-8-19 15:12
funneies 发表于 2013-8-19 14:15
哈哈,谢谢了,自己太不仔细了。

刚刚回完你的,自己又出了一个同样的问题,花了我半个多小时才找到,伤心啊
作者: 肥猫    时间: 2013-8-19 22:32
2楼说对一般啊,问题的确是出在那一行,不过FORNAME方法获得的不是字节码文件,而是使用字节码文件封装成的唯一CLASS对象,反射其实就是操作这个Class类型的对象而已。
作者: 刘张朋    时间: 2013-8-20 01:07
肥猫 发表于 2013-8-19 22:32
2楼说对一般啊,问题的确是出在那一行,不过FORNAME方法获得的不是字节码文件,而是使用字节码文件封装成的 ...

张老师的视频看多了,搞习惯了,他对Class类对象的称呼如果没记错的话就是“字节码”啦





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