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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© funneies 中级黑马   /  2013-8-19 13:13  /  1705 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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)



评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 神马都是浮云

查看全部评分

5 个回复

倒序浏览
问题在28行:
Class clazz = Class.forName("day06.enhance.ReflectPoint").getClass();
forName方法本身得到的就是一个字节码,你在对得到的(ReflectPoint的)字节码获取字节码,按逻辑算得到的应该是Calss类的字节码了,据我了解Class类是没有构造方法的哈。

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1

查看全部评分

回复 使用道具 举报
哈哈,谢谢了,自己太不仔细了。
回复 使用道具 举报
funneies 发表于 2013-8-19 14:15
哈哈,谢谢了,自己太不仔细了。

刚刚回完你的,自己又出了一个同样的问题,花了我半个多小时才找到,伤心啊
回复 使用道具 举报
2楼说对一般啊,问题的确是出在那一行,不过FORNAME方法获得的不是字节码文件,而是使用字节码文件封装成的唯一CLASS对象,反射其实就是操作这个Class类型的对象而已。

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
肥猫 发表于 2013-8-19 22:32
2楼说对一般啊,问题的确是出在那一行,不过FORNAME方法获得的不是字节码文件,而是使用字节码文件封装成的 ...

张老师的视频看多了,搞习惯了,他对Class类对象的称呼如果没记错的话就是“字节码”啦
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马