我正在尝试制作一个Java工具来扫描Java应用程序的结构并提供一些有意义的信息。为此,我需要能够从项目位置(JAR/WAR或只是一个文件夹)扫描所有.class文件,并使用反射来了解它们的方法。事实证明这几乎是不可能的。我可以找到很多基于URLClassloader的解决方案,这些解决方案允许我从目录/存档加载特定类,但没有一个解决方案允许我在没有任何关于类名或包结构的信息的情况下加载类。编辑:我觉得我表达得很糟糕。我的问题不是我无法获得所有的类文件,我可以通过递归等来做到这一点并正确定位它们。我的问题是为每个类文件获取一个类对象。 最佳答案
我知道Java-the-compilable-programming-language与Java-the-bytecode-format-for-JVM-execution不同。有一些在.class格式中有效但在.java源代码中无效的示例,例如无构造函数的类和合成方法。如果我们手工制作一个带有Java语言保留关键字(例如int、while)的.class文件作为类、方法或字段名,Java虚拟机会接受它进行加载吗?如果加载了类,是否意味着访问该类或成员的唯一方法是通过Java反射,因为在Java编程语言中该名称在语法上是非法的? 最佳答案
我知道Java-the-compilable-programming-language与Java-the-bytecode-format-for-JVM-execution不同。有一些在.class格式中有效但在.java源代码中无效的示例,例如无构造函数的类和合成方法。如果我们手工制作一个带有Java语言保留关键字(例如int、while)的.class文件作为类、方法或字段名,Java虚拟机会接受它进行加载吗?如果加载了类,是否意味着访问该类或成员的唯一方法是通过Java反射,因为在Java编程语言中该名称在语法上是非法的? 最佳答案
我尝试实例化以下Java代码中定义的内部类:publicclassMother{publicclassChild{publicvoiddoStuff(){//...}}}当我尝试获取这样的Child实例时Classclazz=Class.forName("com.mycompany.Mother$Child");Childc=clazz.newInstance();我得到了这个异常(exception):java.lang.InstantiationException:com.mycompany.Mother$Childatjava.lang.Class.newInstance0(Cl
我尝试实例化以下Java代码中定义的内部类:publicclassMother{publicclassChild{publicvoiddoStuff(){//...}}}当我尝试获取这样的Child实例时Classclazz=Class.forName("com.mycompany.Mother$Child");Childc=clazz.newInstance();我得到了这个异常(exception):java.lang.InstantiationException:com.mycompany.Mother$Childatjava.lang.Class.newInstance0(Cl
我想获取属于某个包的所有类及其所有子类的列表。这些类可能已加载到JVM中,也可能尚未加载。 最佳答案 这不是程序化解决方案,但您可以运行java-verbose:class....JVM会转储它正在加载的内容,以及从哪里加载。[Opened/usr/java/j2sdk1.4.1/jre/lib/rt.jar][Opened/usr/java/j2sdk1.4.1/jre/lib/sunrsasign.jar][Opened/usr/java/j2sdk1.4.1/jre/lib/jsse.jar][Opened/usr/java/
我想获取属于某个包的所有类及其所有子类的列表。这些类可能已加载到JVM中,也可能尚未加载。 最佳答案 这不是程序化解决方案,但您可以运行java-verbose:class....JVM会转储它正在加载的内容,以及从哪里加载。[Opened/usr/java/j2sdk1.4.1/jre/lib/rt.jar][Opened/usr/java/j2sdk1.4.1/jre/lib/sunrsasign.jar][Opened/usr/java/j2sdk1.4.1/jre/lib/jsse.jar][Opened/usr/java/
我有这个代码:TypetypeOfObjectsList=newTypeToken>(){}.getType();ListobjectsList=newGson().fromJson(json,typeOfObjectsList);它将JSON字符串转换为对象的List。但现在我想要这个ArrayList具有动态类型(不仅仅是myClass),在运行时定义。ArrayList的项目类型将使用reflection定义。我试过了:privateTypesetModelAndGetCorrespondingList2(Classtype){TypetypeOfObjectsListNew=n
我有这个代码:TypetypeOfObjectsList=newTypeToken>(){}.getType();ListobjectsList=newGson().fromJson(json,typeOfObjectsList);它将JSON字符串转换为对象的List。但现在我想要这个ArrayList具有动态类型(不仅仅是myClass),在运行时定义。ArrayList的项目类型将使用reflection定义。我试过了:privateTypesetModelAndGetCorrespondingList2(Classtype){TypetypeOfObjectsListNew=n
我在Java中有一个对象(基本上是一个VO),但我不知道它的类型。我需要获取该对象中不为空的值。如何做到这一点? 最佳答案 您可以使用Class#getDeclaredFields()获取类的所有声明字段。您可以使用Field#get()获取值(value)。简而言之:ObjectsomeObject=getItSomehow();for(Fieldfield:someObject.getClass().getDeclaredFields()){field.setAccessible(true);//Youmightwanttose