java在当前方法内部想得到当前方法参数类型列表,可以通过对该方法所在的类进行反射来得到当前方法的参数列表。对当前对象进行反射可以得到类中所有成员变量和方法的对象数组,对当前方法的名字与方法数组进行比较,得到相同名字的方法(即当前方法),然后通过使用该方法对象的方法来获得参数列表。
1、面向对象思想的继承是子类继承父类,父类被其它子类继承在JAVA虚拟机的容器中并没有直接接口获取;
2、如果是在一个项目内获取父类的子类继承情况,参考这个代码:
package find;import javaioFile;
import javaioIOException;
import javanetURL;
import javautilArrayList;
import javautilList;
import findtestIntf;
import findtestMan;
public class ClassUtil {
public static void main(String[] args) {
try {
Systemoutprintln("接口实现类:");
for (Class<> c : getAllAssignedClass(Intfclass)) {
Systemoutprintln(cgetName());
}
Systemoutprintln("子类:");
for (Class<> c : getAllAssignedClass(Manclass)) {
Systemoutprintln(cgetName());
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
eprintStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
eprintStackTrace();
}
}
/
获取同一路径下所有子类或接口实现类
@param intf
@return
@throws IOException
@throws ClassNotFoundException
/
public static List<Class<>> getAllAssignedClass(Class<> cls) throws IOException,
ClassNotFoundException {
List<Class<>> classes = new ArrayList<Class<>>();
for (Class<> c : getClasses(cls)) {
if (clsisAssignableFrom(c) && !clsequals(c)) {
classesadd(c);
}
}
return classes;
}
/
取得当前类路径下的所有类
@param cls
@return
@throws IOException
@throws ClassNotFoundException
/
public static List<Class<>> getClasses(Class<> cls) throws IOException,
ClassNotFoundException {
String pk = clsgetPackage()getName();
String path = pkreplace('', '/');
ClassLoader classloader = ThreadcurrentThread()getContextClassLoader();
URL url = classloadergetResource(path);
return getClasses(new File(urlgetFile()), pk);
}
/
迭代查找类
@param dir
@param pk
@return
@throws ClassNotFoundException
/
private static List<Class<>> getClasses(File dir, String pk) throws ClassNotFoundException {
List<Class<>> classes = new ArrayList<Class<>>();
if (!direxists()) {
return classes;
}
for (File f : dirlistFiles()) {
if (fisDirectory()) {
classesaddAll(getClasses(f, pk + "" + fgetName()));
}
String name = fgetName();
if (nameendsWith("class")) {
classesadd(ClassforName(pk + "" + namesubstring(0, namelength() - 6)));
}
}
return classes;
}
}
加载到方法区的是类的定义信息(元信息),简单来说就是jvm根据class生成的一个数据结构(klass),包含了类的定义,比如类名,全名,包含哪些属性和方法,这些也都是用一个结构来标识的。
只要是定义在类中的,编译后写到class文件中的,加载后都会被解析,在方法区生成类元信息。静态方法和变量也属于类。
给你写了个例子你看下哈。。
import javalangreflectField;
public class GetField {
public static void main(String[] args) {
try {
Class clazz = ClassforName("");//根据类名获得其对应的Class对象 写上你想要的类名就是了 注意是全名 如果有包的话要加上 比如javaLangString
Field[] fields = clazzgetDeclaredFields();//根据Class对象获得属性 私有的也可以获得
for(Field f : fields) {
Systemoutprintln(fgetType()getName());//打印每个属性的类型名字
}
} catch(Exception e) {
eprintStackTrace();
}
}
}
这里要说明一下,super和this的区别,this表示当前对象的指针(或叫引用),super是一个java关键字,用于访问父类的成员和方法。
所以调用的getClass()的确是父类方法,但是当前对象已经是子类了,而不是父类,你必须明白,super不代表父类对象。
如果你想要得到父类对象,需要通过反射机制的到,代码如下:
Class c = 子类class;
cgetSuperclass()getName();
这解释明白么?还有什么疑问?
java文件是源代码文件,必须要编译成class文件才能被JVM加载。使用ClassforName(类全名)动态加载类到jvm中。class文件必须位于classpath环境变量中的路径下。
以上就是关于java 怎么在当前方法内部得到当前方法的参数类型列表全部的内容,包括:java 怎么在当前方法内部得到当前方法的参数类型列表、Java中怎样获取一个类的所有子类、如下Java中的类信息等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)