我觉得你写的是对的
StackTraceElement[] st = exgetStackTrace();
for (StackTraceElement stackTraceElement : st) {
String exclass = stackTraceElementgetClassName();
String method = stackTraceElementgetMethodName();
Systemoutprintln(exclass);
Systemoutprintln(method);
}
}
这个就是整个异常抛出的栈结构啊
1首先,把你指定的包,转换成本地路径
2列出本地路径下的所有类,并把class去掉,再拼接上 包名
3根据上面获取的类的全限定名,依次利用ClassforName(StringName)newInstance()来创建实例
4把创建好的实例添加到集合中。
Code:
/
根据包名来获取此包下所有的类名及其实例
@param packName
@return
/
public static Set<Object> getObjectsInPackage(String packName){
Set<Object> objs = new HashSet<Object>();
String packageName = packName;
String packageDirName = packageNamereplace("", "/");
Enumeration<URL> dirs = null;
try {
dirs = ThreadcurrentThread()getContextClassLoader()getResources(packageDirName);
//迭代此 Enumeration
while(dirshasMoreElements()){
URL url = dirsnextElement();
File file = new File(urlgetFile());
//把此目录下的所有文件列出
String[] classes = filelist();
//循环此数组,并把class去掉
for(String className : classes){
className = classNamesubstring(0,classNamelength()-6);
//拼接上包名,变成全限定名
String qName = packageName+""+className;
//如有需要,把每个类生实一个实例
Object obj = ClassforName(qName)newInstance();
//添加到集合中
objsadd(obj);
}
}
} catch (Exception e) {
eprintStackTrace();
}
return objs;
}
先通过IO,定位到这个包
通过Filelist得到一个包含这个包下所有class的文件的数组。
循环这个数组,用包名拼接每一个遍历出来的文件的名字,得到每一个完整的类名(即,包名加类名)
通过classforname反射得到每一个类实例
使用反射可以获取到;
代码如下:
import javalangreflectField; //这是需要引入的包Field[] f = 类名classgetDeclaredFields(); //获取该类的字段(public, protected, default (package) access, and private)for(Field ff:f) //遍历字段
{
Systemoutprintln(ffgetType()); //获取字段类型
Systemoutprintln(ffgetName()); //获取字段名
}
String packageName = AclassgetPackage()getName();
或者:
packageName = new A()getClass()getPackeage()getName();
即可获得包名了。
以上就是关于java中,想记录异常信息,该如何获得发生异常的类名和方法名呢不要用log4j等。全部的内容,包括:java中,想记录异常信息,该如何获得发生异常的类名和方法名呢不要用log4j等。、java 获取指定包下类的实例(100分)、java如何通过反射获取包中所有的类等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)