是否可以使用反射遍历包内的所有类? [复制]

     2023-03-07     280

关键词:

【中文标题】是否可以使用反射遍历包内的所有类? [复制]【英文标题】:Is possible iterate over all classes inside a package with Reflection? [duplicate] 【发布时间】:2012-04-11 11:51:40 【问题描述】:

我有一个有一些价值的字符串。我想遍历调用特定方法的包中的所有类,如果方法返回的值等于我的字符串中的值,则创建该类的对象。

我想以动态的方式做这件事,所以如果我在这个包中添加一个类,它会自动在迭代中。

可以这样做吗? 如果没有,有办法做我想做的事吗?


我期待类似的东西。

for(Class clazz: SomeClass.listClasses("org.package"))
     //code here

【问题讨论】:

“在这个包中添加一个类”是什么意思?它是如何进入java进程的classpath的? @Jeffrey 我正在阅读有关反射的信息,我认为这是唯一的方法,但我对反射一无所知。我尝试了一种“正常方式”为我在该包中的每个类添加验证,但我不想要这种方式,因为它不可扩展。 @MiserableVariable 在开发时,我在包中添加了一些新类(所有类都扩展了一个名为 Document 的抽象类)。 @RenatoDinhaniConceição 反射是解决这个问题的一种方法,但是你有没有尝试过反射?那里有相当不错的tutorials... 我不明白这是一项反思的工作。更多的文件系统/类加载器工作。 【参考方案1】:

我可以想到两种方法来解决我认为您的问题,尽管它们都没有真正迭代包中的所有类。

一种是创建一个单独的文件,列出应该调用该特定方法的类。这很容易实现。您可能需要做一些创建文件的工作,但这可以自动完成。

第二个选项是在某个众所周知的地方寻找 .class 文件——比如一个文件夹或一组文件夹——然后猜测类名是什么并加载它。如果这是一个简单的开发过程,单个包中的类文件可能位于单个目录中。

【讨论】:

【参考方案2】:

是的,但不是一般情况下的解决方案。您必须打包代码并以特定方式调用 JVM。具体来说,您需要创建一个 Instrumentation 代理,并调用 java.lang.instrument.Instrumentation.getAllLoadedClasses()

documentation for java.lang.instrument 包有很多关于如何创建和实例化代理的详细信息。

【讨论】:

他不仅想要加载的类,而且(大概)任何新的类文件都放在类路径的文件夹中 @MiserableVariable 我不知道是否清楚,但我要加载的类是在开发时定义的,而不是在运行时。【参考方案3】:

不,这不可能完全可靠;但是,在许多情况下实施起来可能是切实可行的。

由于 Java 类加载器的灵活性,特定包下定义的类在运行时可能不知道(例如,考虑一个特殊的类加载器,它可以动态定义类,可能通过从网络加载它们,或编译它们是临时的)。因此,没有标准的 Java API 允许您列出包中的类。

然而,实际上,您可以通过在类路径中搜索所有类和 JAR 文件、构建完全限定类名的集合并根据需要搜索它们来做一些技巧。如果您确定没有活动的类加载器会像上一段中描述的那样运行,则此策略将正常工作。例如(Java 伪代码):

Map<String, Set<String>> classesInPackage = new HashMap();
for (String entry : eachClasspathEntry()) 
  if (isClassFile(entry)) 
    String packageName = getPackageName(entry);
    if (!classesInPackage.containsKey(packageName)) 
      classesInPackage.put(packageName, new HashSet<String>());
    
    classesInPackage.get(packageName).add(getClassName(entry));
   else if (isJarOrZipFile(entry)) 
    // Do the same for each JAR/ZIP file entry...
  

classesInPackage.get("com.foo.bar"); // => Set<String> of each class...

【讨论】:

但是自定义类加载器可以,至少在理论上是这样。 @MiserableVariable:假设我编写了一个自定义类加载器,它通过返回一个类的字节码来实现defineClass(String) 方法,该类通过给定的类名定义一个空类。这是一个完全有效的类加载器,没有(实用的)方法可以列出它可以定义的每个类。 是的,一般来说问题是无法解决的。但是对于特定的狭窄情况是不同的——我可能想检查文件夹名称 plugins 中的所有 .class 文件,并在每个具有 register 方法的类上创建一个实例。

oracle 查看包内的所有程序和函数

...ideofpackage【发布时间】:2015-10-2321:12:51【问题描述】:我可以在一个包内执行一个过程,但我希望能够查看这个包内的所有过程和函数,因为还有更多。我该怎么做?【问题讨论】:【参考方案1】:全部都在ALL_SOURCE表中。DESCALL... 查看详情

如何编译包内的两个程序?

...内创建了三个程序。现在要编译包里面仅有的两个程序。是否可能,如果是意味着如何?【问题讨论】:【参考方案1】:这是不可能的。您编译可以将包体与它的标头分开编译,但不能编译包体中的各个方法,而只能编译整个... 查看详情

是否可以使用 PHP 将数据发布到 while 循环内的链接? [复制]

】是否可以使用PHP将数据发布到while循环内的链接?[复制]【英文标题】:IsitpossibletoPOSTdatatoalinkinsidewhileloopusingPHP?[duplicate]【发布时间】:2019-02-1723:56:45【问题描述】:我正在使用基本的PHP和AJAX,我想将我从mysql数据库中选择的... 查看详情

可以通过反射类访问的公共,私有,受保护类有啥用? [复制]

】可以通过反射类访问的公共,私有,受保护类有啥用?[复制]【英文标题】:whatistheuseofpublic,private,protectedclasswhereitcanbeaccessviareflectionclass?[duplicate]可以通过反射类访问的公共,私有,受保护类有什么用?[复制]【发布时间】:2... 查看详情

使用反射设置 C# 结构/类字段时是不是可以避免装箱?

...C#struct/classfieldsusingreflection?使用反射设置C#结构/类字段时是否可以避免装箱?【发布时间】:2015-12-0215:14:50【问题描述】:假设我有一个原始值,我需要使用反射将其分配给某个字段。我确定该字段具有相同的原始值类型。是否... 查看详情

在.NET中,你可以使用反射来获取一个类的所有非继承方法吗?

】在.NET中,你可以使用反射来获取一个类的所有非继承方法吗?【英文标题】:In.NET,canyouusereflectiontogetallnon-inheritedmethodsofaclass?【发布时间】:2011-08-1808:36:25【问题描述】:由于这个问题here,我正在尝试编写一个自定义JsonConver... 查看详情

是否可以使用类型正确复制一个类

】是否可以使用类型正确复制一个类【英文标题】:Isitpossibletoproperlycopyaclassusingtype【发布时间】:2018-08-1520:53:28【问题描述】:根据thisanswer,可以复制一个类对象clscls_copy=type(\'cls_copy\',cls.__bases__,dict(cls.__dict__))这适用于大多数... 查看详情

可以使用反射获得类中的瞬态字段吗

...是的,这是一个正常的字段。您可以通过以下方式检查它是否是瞬态的:Modifier 查看详情

java修饰符访问控制

...endly)public的类、类属变量及方法,包内及包外的任何类均可以访问;protected的类、类属变量及方法,包内的任何类,及包外的那些继承了此类的子类才能访问;private的类、类属变量及方法,包内包外的任何类均不能访问;如果... 查看详情

反射的原理

...都是基于配置文件开发的  **在配置文件中配置了类,可以通过反射得到类中的所有内容(属性,有参的构造方法,无参的构造方法,普通方法),然后可以执行类中的方法。所以我们需要知道反射的原理。*反射的原理  **... 查看详情

c++遍历获得一个类的所有属性名,对该类的实例的所有属性的值...~~

...机制是很有特色的,VB,C#,VC语言都支持。通过反射机制,可以轻而易举枚举出一个类的各种信息,除了属性外,还可以获得构造器、方法、字段等各种信息,类型可以是公共的,非公共的,实例化的,静态的各种属性、方法等。... 查看详情

java获取包所有class

...到ClassLoader,并获得资源名对于的资源对象判断资源对象是否为jar包内    4.1若否,则使用文件系统进行处理为文件夹,之后遍历名称进行类加载。这里直接使用资源路径名,会是其真实位置,不用关注因部署在tomc... 查看详情

是否可以通过反射来做到这一点? [复制]

】是否可以通过反射来做到这一点?[复制]【英文标题】:Isitpossibletodothiswithreflection?[duplicate]【发布时间】:2012-10-2205:30:29【问题描述】:可能重复:DynamicLINQOrderBy我有一个自定义排序选项列表,这些选项从客户端网格控件(如... 查看详情

是否可以使用反射修改对象实例的方法

】是否可以使用反射修改对象实例的方法【英文标题】:Isitpossibletomodifymethodsofanobjectinstanceusingreflection【发布时间】:2009-11-1806:38:54【问题描述】:我正在尝试使用普通旧PHP对象创建域模型。我正在创建一个库,它将完成所有基... 查看详情

如何使用反射获取调用方法名称和类型? [复制]

...来获取调用方法的名称,以及包含调用方法的类的名称。是否可以使用C#反射? 查看详情

java反射机制

反射机制:在运行状态中,对于任意一个类,都可以知道他的所有属性和方法,对于任意一个对象,都可以调用它所有的方法,这种可以动态获取和动态调用对象方法的功能称为反射机制。使用场景:逆向代码,如反编译动态注... 查看详情

java核心类库之反射机制

1:什么是反射机制?2:反射机制它可以做什么呢?  3:反射机制对应的API又是什么?1):通过反射机制来获取一个对象的全限定名称(完整包名),和类名;2):实例化Class对象3):获取对象的父类与实现的接口4):获取类中的所有的... 查看详情

如何从应用程序域中所有加载的程序集中获取所有静态类并使用反射调用静态方法

...布时间】:2015-02-1211:20:52【问题描述】:我的要求如下,可以吗?如果是的话,有人可以指点我这方面的任何资源吗?从应用领域获 查看详情