java 怎么在当前方法内部得到当前方法的参数类型列表

java 怎么在当前方法内部得到当前方法的参数类型列表,第1张

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中的类信息等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10151708.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存