Java 如何动态地知道加载的类是否是应用程序类?

Java 如何动态地知道加载的类是否是应用程序类?,java,classloader,Java,Classloader,我所处的情况是,我想对加载的应用程序类进行一些重写,即,当前正在运行的应用程序类。我不想重写加载的库类。因此,我需要根据类的类型、是应用程序类还是非应用程序类对重写进行排序,或者我可以通过检查类加载器并查看它是否属于应用程序类类型来进行排序 为了提供一些上下文,让我们假设我有以下代码 URLClassLoader urlcl = new URLClassLoader(cp); Class c = urlcl.loadClass(_className); 假设_className

我所处的情况是,我想对加载的应用程序类进行一些重写,即,当前正在运行的应用程序类。我不想重写加载的库类。因此,我需要根据类的类型、是应用程序类还是非应用程序类对重写进行排序,或者我可以通过检查类加载器并查看它是否属于应用程序类类型来进行排序

为了提供一些上下文,让我们假设我有以下代码

    URLClassLoader urlcl = new URLClassLoader(cp);
    Class c = urlcl.loadClass(_className);
假设_className是当前正在运行的类,它被侦听器截获,我如何知道这个类c是否是应用程序类


非常感谢

我不完全确定您所说的应用程序类是什么意思,但这些提示可能还是有帮助的

您只需检查一个类是否是另一个类的子类型:

public static boolean is1stSubTypeOf2nd(Class clazz1, Class clazz2) {
    return clazz2.isAssignableFrom(clazz1);
}
如果要检查该类是否属于某个包,以检查该类是否来自标准API、第三方库,则可以使用:

public static boolean isInPackage(Class clazz, String packageName) {
    return clazz.getPackageName().contains(packageName);
}

此外,标准API能够为您提供有关给定类的所有超类的信息。

我不完全确定您所说的应用程序类是什么意思,但这些提示仍然可能有用

您只需检查一个类是否是另一个类的子类型:

public static boolean is1stSubTypeOf2nd(Class clazz1, Class clazz2) {
    return clazz2.isAssignableFrom(clazz1);
}
如果要检查该类是否属于某个包,以检查该类是否来自标准API、第三方库,则可以使用:

public static boolean isInPackage(Class clazz, String packageName) {
    return clazz.getPackageName().contains(packageName);
}

此外,标准API能够为您提供有关给定类的所有超类的信息。

如果我没记错,java有一个名为instanceof的操作符来检查类是否是特定类型,这通常是polymorphism@Nina:instanceof作用于类的实例,而不是类对象本身。Class对象确实有一个asSubclass方法。因此,您可以使用c.asSubclassApplication.class,如果它不是应用程序的子类,它将抛出ClassCastException。@user2478398,谢谢,我已经厌倦了,但似乎Application.class有多个实现,我应该使用哪个实现?我尝试使用com.sun.javafx.tools.ant.Application中的一个,但没有完全奏效。也就是说,当我使用的类确实是一个应用程序类时,出现了一个异常。也许我使用了错误的实现?@user2478398没有理由处理ClassCastException,只是使用。JVM不知道“应用程序类”这样的概念。您必须定义它的含义,一旦澄清了这一点,就很容易检查类的这些属性polymorphism@Nina:instanceof作用于类的实例,而不是类对象本身。Class对象确实有一个asSubclass方法。因此,您可以使用c.asSubclassApplication.class,如果它不是应用程序的子类,它将抛出ClassCastException。@user2478398,谢谢,我已经厌倦了,但似乎Application.class有多个实现,我应该使用哪个实现?我尝试使用com.sun.javafx.tools.ant.Application中的一个,但没有完全奏效。也就是说,当我使用的类确实是一个应用程序类时,出现了一个异常。也许我使用了错误的实现?@user2478398没有理由处理ClassCastException,只是使用。JVM不知道“应用程序类”这样的概念。您必须定义它的含义,一旦澄清了这一点,就很容易检查类的这些属性。