众所周知,如果要想知道一个类里的方法和属性的话,可能需要JAVA的反射机制.
但是现在遇到这样一个问题,就是类A继承类B,如果我要 ClassLoader loader = new URLClassLoader(urls); Class cla = loader.loadClass(classname);的话
即通过loadclass的话,JAVA会自动把类B也加载进来
但是我现在只想知道类A里面的方法和属性,不需要知道类B
有没有这样的一种方法,就是只反射类A里面的方法和属性,不要加载类B,要是这样的话,类B里再继承类C,会一直不停的加载进去.
小女子先在此谢过各位达人了!!

解决方案 »

  1.   

    加载进来对你的程序有什么影响吗?
    通过getDeclaredMethods() 直接获取这个类定义的方法即可,它不会去获取继承的方法。
    可以自己去看api文档。
      

  2.   


     Class[] getDeclaredClasses()
              返回 Class 对象的一个数组,这些对象反映声明为此 Class 对象所表示的类的成员的所有类和接口,包括该类所声明的公共、保护、默认(包)
               不包括继承的类和接口。
      

  3.   

    yanhan0615()  发表于:2008-12-17 11:33:11   1   楼  得分:
    用getDeclaringClass()判断一下 
    =======================================
    判断了就不会再加载了吗? 也许我会判断,但是不知道如何让他不加载hbwhwang()  发表于:2008-12-17 11:42:13   3   楼  得分:
    一直加载下去有什么问题呢?总有加载完的时候。
    类的个数总是有限的。 
    ============================这样是很耗资源的.而且程序中不需要加载父类,我只需要知道子类的方法和属性就可以了.其他的不需要知道,因此没必要为此浪费资源.
    eatingbirdmiemies()  发表于:2008-12-17 11:35:08   2   楼  得分:
    可以尝试自定义一个类加载器.
    不过既使是自定义的,不加载父类也很容易报错的咩. 
    ====================================================
    咩 这个字念什么? YANG还是me?
      

  4.   

    copy错了…… Method[] getDeclaredMethods()
              返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,
               但不包括继承的方法。
      

  5.   

    jvm定义的加载机制,不知道能不能改,呵呵。
      

  6.   

     Class[] getDeclaredClasses()
    这个需要先load进来以后,才可以用这个方法.但是通常都是在Class cla = loader.loadClass(classname);的时候,就已经加载父类了呀
      

  7.   

    我看过class.forname
    这个方法.不需要加载.直接就是反射类.
    JAR包里的CLASS,可不可以通过反射的机制得到方法和属性呢
    其实我只需要得到方法和属性,不需要JVM加载进来
      

  8.   

    不加载父类可以吗??我不知道。
    通过 getDeclaredMethods()  方法只返回 这个类定义的方法,它的父类是不会返回的。对你的程序有什么影响呢?该不是怕浪费内存吧。getDeclaredMethods():
    返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。返回数组中的元素没有排序,也没有任何特定的顺序。如果该类或接口不声明任何方法,或者此 Class 对象表示一个基本类型、一个数组类或 void,则此方法返回一个长度为 0 的数组。类初始化方法 <clinit> 不包含在返回数组中。如果该类声明带有相同参数类型的多个公共成员方法,则它们都包含在返回的数组中。
      

  9.   

    查查api:java.lang.Class
    getDeclaredFields
    getDeclaredMethods
      

  10.   

    呃,sorry,开始没看清楚lz的意思,我以为你是load出来以后不知道怎么判断字段和方法的所属类,如果是加载时候判断的话,那就自己写一个加载器吧,直接对指定的.class进行加载
      

  11.   

    如果仅仅想分析一下某个类的内部结构(例如只想了解一下 String.class 这个类文件的内部结构而又不想加载它和它的超类然后再用反射来分析),可以自己根据 Java语言规范 和 JVM规范 中对 *.class 文件格式的描述来读取并分析 class 文件,当然使用现成的类库来分析更方便,比如 BCEL,BCEL 下载地址和使用方法参见:http://jakarta.apache.org/bcel/manual.html
      

  12.   

    你不加在父类,怎么得到子类,虽然子类也是一个独立的class文件,但是总是依赖于父类的,所以不存在资源浪不浪费的问题,
    就像吃第10个烧饼才吃饱,难道就不吃前9个了么
      

  13.   

    我觉得class.forName这个方法可能和loadclass不太一样.
    一般的CLASS文件,我是用的class.forName
    对于JAR包里的文件,直接用class.forName是不可以的.第一没有放到环境变量中(刚才做了一个试验,我放在classpath里了也不行)第二是以工程的class下没有,所以用这个反射的话会报找不到类的错误
    而用loadclass的话,貌似和class.forName真的不太一样,他是加载该类,我认为class.forName仅仅是分析该类
    现在我倒是在想,有没有办法让JAR包中的类直接用class.forName我或许应该看下 BCEL
      

  14.   

    我觉得 ClassLoader A类的 父类 会浪费多大的资源!
    不过我觉得 你去研究下 Class.forName() 的本地代码 我想也是很值得的!
      

  15.   

    少了个不字......我不觉得 ClassLoader A类的父类会浪费多大的资源! 
    不过我觉得 你去研究下 Class.forName() 的本地代码 我想也是很值得的! 
      

  16.   

    子类的构造一定会调用父类的直到Object。所以即使能只加载子类,也没用,你不能创建子类对象。如同18楼说的一样。
      

  17.   

    duhongltz  子类的构造一定会调用父类的直到Object。所以即使能只加载子类,也没用,你不能创建子类对象。如同18楼说的一样。=========================
    看来这位和18楼的没明白我的意思.
    我只是想反射这个类,而不是想加载,关键是如何搞定这个问题.
    我需要的是类似于class.forname而不是loadclass.
    JAR包中,如何去class.forname
      

  18.   

    把类B设计成接口的话,会怎么样呢,
    关注中ING。学习一下。。
      

  19.   

    采用jvm的接口,加载子类肯定会加载父类的。
    如果lz只是想分析子类的接口,可以考虑自己定制classloader或者直接读class文件来解析。
      

  20.   

    如果你只是想分析类里面定义了什么方法的话,按上面提供的解析class文件即可。
    如果想利用反射的话,还是免不了要加载父类,因为调用父类的构造方法总是不可避免的吧。