众所周知,如果要想知道一个类里的方法和属性的话,可能需要JAVA的反射机制.
但是现在遇到这样一个问题,就是类A继承类B,如果我要 ClassLoader loader = new URLClassLoader(urls); Class cla = loader.loadClass(classname);的话
即通过loadclass的话,JAVA会自动把类B也加载进来
但是我现在只想知道类A里面的方法和属性,不需要知道类B
有没有这样的一种方法,就是只反射类A里面的方法和属性,不要加载类B,要是这样的话,类B里再继承类C,会一直不停的加载进去.
小女子先在此谢过各位达人了!!
但是现在遇到这样一个问题,就是类A继承类B,如果我要 ClassLoader loader = new URLClassLoader(urls); Class cla = loader.loadClass(classname);的话
即通过loadclass的话,JAVA会自动把类B也加载进来
但是我现在只想知道类A里面的方法和属性,不需要知道类B
有没有这样的一种方法,就是只反射类A里面的方法和属性,不要加载类B,要是这样的话,类B里再继承类C,会一直不停的加载进去.
小女子先在此谢过各位达人了!!
通过getDeclaredMethods() 直接获取这个类定义的方法即可,它不会去获取继承的方法。
可以自己去看api文档。
Class[] getDeclaredClasses()
返回 Class 对象的一个数组,这些对象反映声明为此 Class 对象所表示的类的成员的所有类和接口,包括该类所声明的公共、保护、默认(包)
不包括继承的类和接口。
用getDeclaringClass()判断一下
=======================================
判断了就不会再加载了吗? 也许我会判断,但是不知道如何让他不加载hbwhwang() 发表于:2008-12-17 11:42:13 3 楼 得分:
一直加载下去有什么问题呢?总有加载完的时候。
类的个数总是有限的。
============================这样是很耗资源的.而且程序中不需要加载父类,我只需要知道子类的方法和属性就可以了.其他的不需要知道,因此没必要为此浪费资源.
eatingbirdmiemies() 发表于:2008-12-17 11:35:08 2 楼 得分:
可以尝试自定义一个类加载器.
不过既使是自定义的,不加载父类也很容易报错的咩.
====================================================
咩 这个字念什么? YANG还是me?
返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,
但不包括继承的方法。
这个需要先load进来以后,才可以用这个方法.但是通常都是在Class cla = loader.loadClass(classname);的时候,就已经加载父类了呀
这个方法.不需要加载.直接就是反射类.
JAR包里的CLASS,可不可以通过反射的机制得到方法和属性呢
其实我只需要得到方法和属性,不需要JVM加载进来
通过 getDeclaredMethods() 方法只返回 这个类定义的方法,它的父类是不会返回的。对你的程序有什么影响呢?该不是怕浪费内存吧。getDeclaredMethods():
返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。返回数组中的元素没有排序,也没有任何特定的顺序。如果该类或接口不声明任何方法,或者此 Class 对象表示一个基本类型、一个数组类或 void,则此方法返回一个长度为 0 的数组。类初始化方法 <clinit> 不包含在返回数组中。如果该类声明带有相同参数类型的多个公共成员方法,则它们都包含在返回的数组中。
getDeclaredFields
getDeclaredMethods
就像吃第10个烧饼才吃饱,难道就不吃前9个了么
一般的CLASS文件,我是用的class.forName
对于JAR包里的文件,直接用class.forName是不可以的.第一没有放到环境变量中(刚才做了一个试验,我放在classpath里了也不行)第二是以工程的class下没有,所以用这个反射的话会报找不到类的错误
而用loadclass的话,貌似和class.forName真的不太一样,他是加载该类,我认为class.forName仅仅是分析该类
现在我倒是在想,有没有办法让JAR包中的类直接用class.forName我或许应该看下 BCEL
不过我觉得 你去研究下 Class.forName() 的本地代码 我想也是很值得的!
不过我觉得 你去研究下 Class.forName() 的本地代码 我想也是很值得的!
看来这位和18楼的没明白我的意思.
我只是想反射这个类,而不是想加载,关键是如何搞定这个问题.
我需要的是类似于class.forname而不是loadclass.
JAR包中,如何去class.forname
关注中ING。学习一下。。
如果lz只是想分析子类的接口,可以考虑自己定制classloader或者直接读class文件来解析。
如果想利用反射的话,还是免不了要加载父类,因为调用父类的构造方法总是不可避免的吧。