服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

在java调试中如何获得被装载类的实际路径


  java.security.codesource;
java.security.protectiondomain;

codesource 可以给出类的原始url的位置,但并不是每个类都有codesource。如果类通过引导类装载器装载,codesource为空。

import java.lang.reflect.method;
import java.net.url;
import java.security.codesource;
import java.security.protectiondomain;


public class debug
{

public static void displayclassinfo(class clazz, stringbuffer results)
{
displayclassinfo(clazz, results, true);
}
public static void displayclassinfo(class clazz, stringbuffer results,
boolean showparentclassloaders)
{

classloader cl = clazz.getclassloader();
results.append("/n"+clazz.getname()+"("+integer.tohexstring(clazz.hashcode())+").classloader="+cl);
classloader parent = cl;
while( parent != null )
{
results.append("/n.."+parent);
url[] urls = getclassloaderurls(parent);
int length = urls != null ? urls.length : 0;
for(int u = 0; u < length; u ++)
{
results.append("/n...."+urls[u]);
}
if( showparentclassloaders == false )
break;
if( parent != null )
parent = parent.getparent();
}
codesource clazzcs = clazz.getprotectiondomain().getcodesource();
if( clazzcs != null )
results.append("/n++++codesource: "+clazzcs);
else
results.append("/n++++null codesource");

results.append("/nimplemented interfaces:");
class[] ifaces = clazz.getinterfaces();
for(int i = 0; i < ifaces.length; i ++)
{
class iface = ifaces[i];
results.append("/n++"+iface+"("+integer.tohexstring(iface.hashcode())+")");
classloader loader = ifaces[i].getclassloader();
results.append("/n++++classloader: "+loader);
protectiondomain pd = ifaces[i].getprotectiondomain();
codesource cs = pd.getcodesource();
if( cs != null )
results.append("/n++++codesource: "+cs);
else
results.append("/n++++null codesource");
}
}

/** use reflection to access a url[] geturls or ulr[] getallurls method so
that non-urlclassloader class loaders, or class loaders that override
geturls to return null or empty, can provide the true classpath info.
*/
public static url[] getclassloaderurls(classloader cl)
{
url[] urls = {};
try
{
class returntype = urls.getclass();
class[] parametertypes = {};
method geturls = cl.getclass().getmethod("geturls", parametertypes);
if( returntype.isassignablefrom(geturls.getreturntype()) )
{
object[] args = {};
urls = (url[]) geturls.invoke(cl, args);
}
}
catch(exception ignore)
{
}
return urls;
}

}

扫描关注微信公众号