获取带有注释的所有类并将它们添加到 android 中的 hashMap

2024-05-06

我不确定这是否可能,但我基本上希望能够轻松地将新项目添加到列表中,只需添加带有特殊注释的类即可。我能想到的唯一例子就是我目前正在做的事情。用户可以完成很多“挑战”,目前我的应用程序中有一个用于“挑战”的包,我希望能够在该包中创建一个新类,给它一个带有一些注释的注释价值观,比如...

@Challenge(key="new_challenge")
public class NewChallenge extends Achievement {... }

每个挑战的键都会不同,它将是挑战名称,然后在我的代码中,我希望能够将它们全部添加到 HashMap 中,并使用该“键”作为哈希映射键,因此它将是 map.add (注释键, class);听起来应该是可能且可行的。我想知道,如果可能的话,这是否是正确的做法,以及如何才能做到?

编辑1 我能够使用 gradle 实现 Reflections,但它总是显示为空。根本没有找到注释。这是我的方法..

挑战.java

package com.test.annotationtest.annotations;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface Challenge {
  public String key();
}

然后,对于我的挑战之一,我... 测试挑战.java

package com.test.annotationtest.challenges

import com.test.annotationtest.R;
import com.test.annotationtest.annotation.Challenge;

@Challenge(key="test_challenge")
public class TestChallenge extends Achievement {
  public String name = "Test Challenge";
  public TestChallenge() {}
}

然后在我的主要活动中我... MainActivity.java

package com.test.annotationtest;
import...

public class MainActivity extends AppCompatActivity {
  public Reflections reflections = new Reflections("com.test"); // have tried "com.test.annotationtest" and "com.test.annotationtest.challenges"
  public static Map<String, Achievement> achievements;
  public static List<String> names = new ArrayList<>();

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    achievements = getClasses();
    //setup recycler view and all that to show achievements
  }

  public Map<String, Achievement> getClasses() {
    Set<Class<?>> challengeClasses = reflections.getTypesAnnotatedWith(Challenge.class);
    Log.d("Main Activity", "The Challenges");
    Log.d("MAin Activity", "How many are there? " + Integer.toString(challengeClasses.size());
    //more processing on them;
  }
}

但每次我在模拟器上运行该应用程序时,它都会显示在 logcat 中。 主要活动:挑战 主要活动: 有多少个? 0

我在挑战包中有 9 个类,所有类都用 @Challenge(key="name") 进行了注释,但它们都没有出现反射 getTypesAnnotatedWith 返回。每个人的“名字”都不同。任何帮助,将不胜感激。谢谢。


您可以创建自己的注释:

@Retention(RetentionPolicy.RUNTIME)
public @interface Challenge {
    public String key() default "";

}

那么你可以使用反思 https://github.com/ronmamo/reflections获取所有带注释的类。

Set<Class<?>> challengeClasses = reflections.getTypesAnnotatedWith(Challenge.class);

然后您可以通过以下方式提取密钥:

String key = challengeClass.getAnnotation(Challenge.class).key();

但请注意,只有在确实必要时才应谨慎使用反射。使用它你就会失去对代码正确性的控制。

Example:

com.test.webapp.Main

package com.test.testapp;

import com.test.testapp.annotations.Challenge;
import org.reflections.Reflections;

import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        Reflections reflections = new Reflections("com.test.testapp");

        Set<Class<?>> challengeClasses = reflections.getTypesAnnotatedWith(Challenge.class);
        Map challengeClassesMap = challengeClasses.stream().collect(
                                                            Collectors.toMap(
                                                                    challengeClass -> challengeClass.getAnnotation(Challenge.class).key(),
                                                                    Main::createNewInstanceOfClass
                                                            )
        );

        challengeClassesMap.forEach(
                (key, challengeClass) -> System.out.println(key + " = " + challengeClass.toString())
        );
    }

    private static <T> T createNewInstanceOfClass(Class<T> someClass) {
        try {
            return someClass.newInstance();
        } catch (Exception e) {
            return null; //Bad idea but now it's waste of time
        }
    }
}

com.test.testapp.annotations.Challenge

package com.test.testapp.annotations;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface Challenge {
    public String key();
}

com.test.testapp.challenges.SomeChallenge

package com.test.testapp.challenges;

import com.test.testapp.annotations.Challenge;

@Challenge(key = "some_challenge")
public class SomeChallenge {
    public String name = "Some Challenge";

    @Override
    public String toString() {
        return "SomeChallenge{" +
                "name='" + name + '\'' +
                '}';
    }
}

com.test.testapp.challenges.AnotherChallenge

package com.test.testapp.challenges;

import com.test.testapp.annotations.Challenge;

@Challenge(key = "another_challenge")
public class AnotherChallenge {
    public String name = "Another Challenge";

    @Override
    public String toString() {
        return "AnotherChallenge{" +
                "name='" + name + '\'' +
                '}';
    }
}

pom.xml 依赖项(我使用的是 Maven)

<dependency>
        <groupId>org.reflections</groupId>
        <artifactId>reflections</artifactId>
        <version>0.9.11</version>
</dependency>

Output

some_challenge = SomeChallenge{name='Some Challenge'}
another_challenge = AnotherChallenge{name='Another Challenge'}

我没有更多的代码了。目录与包相同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取带有注释的所有类并将它们添加到 android 中的 hashMap 的相关文章

随机推荐

  • 在 MATLAB 中将数据拟合到 B 样条

    我正在尝试估计矩阵形式的时间序列数据中的缺失值 列代表时间点 即现在 我想将矩阵的每一行拟合到 B 样条曲线 并用它来估计缺失值 我可以使用 MATLAB 将数据拟合到普通样条曲线 但我完全陷入尝试找出如何拟合数据以创建 B 样条曲线的困境
  • Android:如何获取设备的真实屏幕尺寸?

    我尝试了不同的方法来获取设备的屏幕尺寸 但它总是返回错误的尺寸 791x480代替854x480 可能是导航栏的原因 我的设备当前运行的是 JellyBean 4 1 1 I tried Display display getWindowM
  • OSGI - 处理捆绑包所需的第 3 方 JAR

    我刚刚开始 OSGI 开发 正在努力了解如何最好地处理依赖的 JAR 也就是说 如果我要创建一个捆绑包 我很可能需要使用一些第 3 方 JAR 当我创建要部署到 OSGI 的捆绑包 JAR 时 显然不包含这些第 3 方 JAR 因此该捆绑包
  • event.getSource() 返回 null android 中的可访问性

    我尝试使用 DashLane 等辅助服务或其他一些使用辅助服务的应用程序来填充 EditText 字段 我正在使用聚焦事件视图 当 EditText 获得焦点时 事件开始但是getSource 返回空值 Code Accessibility
  • 奇怪的 JavaCore IType 缓存问题

    我正在开发一个插件 它接受工作区中实现某些接口 IDomain 的所有枚举 解析代码 使用 AST 对枚举进行一些修改 并将其标记为使用注释 IDomainInfo 进行处理 例如 它需要这样的东西 public enum SomeEnum
  • conda 环境中 conda 和 pip 安装的区别

    我似乎经常问自己这个问题 最近改用 conda 环境 Anaconda 但我最终用谷歌搜索并没有走得太远 我现在在自己的 conda 环境中运行所有项目 因为我喜欢将所有内容保持独立 并尽可能减少对其他程序的依赖 比如最近的一个环境 con
  • Facebook Analytics:使用图形 API 的用户属性和记录事件

    我有 facebook 应用程序 Messenger Bot 应用程序 我使用图形 API 端点记录每个用户的自定义事件 申请 活动 事件被完美记录 我想要做的是为我的信使机器人用户创建自定义属性 以便我可以使用此属性对应用程序数据进行分段
  • 在 Android 中处理多个回收器视图 [Kotlin]

    我遇到过这样的情况 一个布局上有 3 个 RecyclerView 他们以某种方式相互依赖 数据来自房间数据库 问题原型 问题陈述 假设您有类似 Floor1 Floor2 Floor3 等 的楼层 并且每个楼层内都有类似 Room1 Ro
  • HTMLAgilityPack 中的 XPath 选择无法按预期工作

    我正在用 C 编写简单的屏幕抓取程序 为此我需要选择放置在一个名为 aspnetForm 的单个表单内的所有输入 页面上有 2 个表单 我不希望来自另一个表单的输入 并且此表单中的所有输入都放置在不同的表 div 中 或者仅放置在该表单的第
  • GHC 可以为 monad 转换器派生 Functor 和 Applicative 实例吗?

    我正在尝试实施MaybeT本着mtl图书馆 使用这个非编译解决方案 LANGUAGE FlexibleInstances MultiParamTypeClasses UndecidableInstances import Control M
  • 如何使用 NumPy/SciPy 进行简单的高斯混合采样和 PDF 绘图?

    我添加三个正态分布以获得一个新的分布 如下所示 如何在python中根据这个分布进行采样 import matplotlib pyplot as plt import scipy stats as ss import numpy as np
  • UITextView 放入 UITableViewCell 时有时不显示内容

    我想知道是否还有其他人面临同样的问题 我有一个 UITextView 字段放置在 UITableViewCell 中 有时它不显示文本 当我单击或滚动表格视图时 它就会出现 有什么猜测吗 Details 我调用一个方法viewDidLoad
  • 如何创建不在 ScrollView 中或已禁用 ScrollView 的 ListView?

    我想要 ListView 中的一些好东西 例如能够使用 ListAdapter 和项目选择等 但我不想要其中的 ScrollView 部分 我想以不同的方式自己实现该部分 为什么或如何做到这一点并不是这个问题的重点 所以请不要问 为什么 有
  • 如何禁用 Spring 日志记录 DEBUG 消息?

    我正在开发一个简单的桌面应用程序 不是网络应用程序 这是我的log4j properties log4j rootCategory INFO stdout log4j appender stdout org apache log4j Con
  • 所有任务完成后继续任务

    在某些类中 我想使用 Task 异步加载 2 个集合并停止 busyindicator 我尝试这样的事情 var uiScheduler TaskScheduler FromCurrentSynchronizationContext Wai
  • 将块传递给 AFNetworking 方法?

    void getDataFromServer NSMutableDictionary dict NSURL url NSURL URLWithString NSString stringWithFormat doSomething Main
  • 如何快速从字符串中删除特定字符或单词?

    var myString 43321 This is example hahaha 4356 13 我想要的结果是 var resultString This is example 换句话说 我想删除某些单词和数字 这怎么可能 我已经进行了
  • Android 客户端中经过身份验证的 Cloud Endpoint 间歇性失败

    我有一个生产中的应用程序 在调用经过身份验证的云端点时收到大量强制 关闭 最能说明问题的是 java lang IllegalArgumentException 服务未注册 com google android gms internal e
  • dependency walker 在正确运行的系统上给我错误

    我的系统上缺少 dll 我有以下消息 无法加载文件或程序集 mydll dll 或其依赖项之一 当然 mydll 存在于此 它很可能是它所依赖的另一个 dll 我下载了 dependency walker 来检查它可能是什么 我首先在另一个
  • 获取带有注释的所有类并将它们添加到 android 中的 hashMap

    我不确定这是否可能 但我基本上希望能够轻松地将新项目添加到列表中 只需添加带有特殊注释的类即可 我能想到的唯一例子就是我目前正在做的事情 用户可以完成很多 挑战 目前我的应用程序中有一个用于 挑战 的包 我希望能够在该包中创建一个新类 给它