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;
}
}
