免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3118 | 回复: 6
打印 上一主题 下一主题

如何象c 一样进行宏替换 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-06-08 10:45 |只看该作者 |倒序浏览
我在java中遇到一个问题,我从类中动态的获得了其成员变量的信息
,如s1, s1的类型是字符数组,我想获得字符数组的长度,

用法应该是obj.s1.length, 但是s1我是通过STRING对象得到的AA="S1",
没办法象C一样用宏替换---在程序中输出,不可能写成这样吧
obj.&AA.length

论坛徽章:
0
2 [报告]
发表于 2004-06-08 13:56 |只看该作者

如何象c 一样进行宏替换

可以用Java Reflection API
网上很多文档的。你可以看看java.lang.reflect 这个package的java doc

论坛徽章:
0
3 [报告]
发表于 2004-06-09 10:44 |只看该作者

如何象c 一样进行宏替换

可能我没说清楚,我是用反射类了,但没解决问题,
我再把问题说清楚一些,问题的起源于在做一个数据库RAW
字段的转换,JAVA中没有提供这个类,我想自己做一个类
来解决写入和读取的问题。这个类的公用方法的参数肯定要有一个
和 RAW数据类型相对应的类和数据源字段是 String类型.
我肯定要取得该类的成员变量的类型和名称。还要取得长度。类型
和名称简单,通过反射类的相关方法即可得到,但问题是长度,
对于成员变量是字符数组的长度,必须通过取得成员变量的名字
后再通过length方法获得,但问题是java中不支持该种语法:
c中的宏替换在动态处理中是很方便的,java中好像没有,
比如:class Example
   {
    int I1=3;
    char c1[]= new char[10];
   }
   
  
/* 如何在运行时获得一个类的信息*/
    try
    {
      Example obj = new Example();
                    
      java.lang.reflect.Field[] F1 = obj.getClass().getDeclaredFields();
      String Name = new String();
      for (int i=0;i<F1.length;i++)
      {
        System.out.println(F1.getType()); //得到成员变量的类型
                   System.out.println(F1.getName()); //得到成员变量的名字
        Name = F1.getName(); //将成员变量的引用给Name
        
      }      
               
    }
    catch( Exception e)
    {
      System.out.println("err occur";   
    }
   
   /*如何在运行时或得一个类的信息结束*/

  但这儿有一个关键的问题是我想取得c1数组的长度,我当然可以通过obj.c1.length;但是这样就失去意义了,我想通过类似obj.&Name.length
的宏替换的形式动态的得到
该成员变量的信息。但在java中不支持,有没有啥好方法

论坛徽章:
0
4 [报告]
发表于 2004-06-09 11:12 |只看该作者

如何象c 一样进行宏替换

  1. import java.lang.reflect.Array;

  2. public class ReflectionTest {

  3.     public static void main(String[] args) {
  4.         try {
  5.             Example obj = new Example();

  6.             java.lang.reflect.Field[] F1 = obj.getClass().getDeclaredFields();
  7.             String Name = new String();
  8.             for (int i = 0; i < F1.length; i++) {
  9.                 System.out.println(F1[i].getType());
  10.                 System.out.println(F1[i].getName());
  11.                 Name = F1[i].getName();
  12.             }
  13.             //Assume that you have known that "F1[1]" is the char array
  14.             int length = Array.getLength(F1[1].get(obj));
  15.             System.out.println("The length of c1 is: " + length);
  16.         } catch (Exception e) {
  17.             System.out.println("err occur");
  18.         }
  19.     }
  20. }

  21. class Example {

  22.     int I1 = 3;

  23.     char c1[] = new char[10];
  24. }
复制代码

论坛徽章:
0
5 [报告]
发表于 2004-06-09 11:15 |只看该作者

如何象c 一样进行宏替换

这样是不是可以满足你的需求?

论坛徽章:
0
6 [报告]
发表于 2004-06-09 13:34 |只看该作者

如何象c 一样进行宏替换

谢谢,非常感谢,我学JAVA只有一个月的时间,好多东西都不知道,请多
帮助,不过,我还是觉得JAVA中如果能支持宏处理就好了

论坛徽章:
0
7 [报告]
发表于 2004-06-09 16:41 |只看该作者

如何象c 一样进行宏替换

那样语言太复杂了,会明显的降低代码可读性和分析的复杂程度,从软件工程的角度看没有任何好处。
历史上就是因为C++太复杂了,才发明的java,要是和c++一样复杂,就没有必要了。
BTW, Reflection我不是很建议使用。原因就是破坏代码的可读性。和goto的道理是一样的,太强大了,就会破坏性也很大。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP