我使用Reflections库开发了一个应用程序,用于查询具有特定注释的所有类。 在我决定从我的应用程序创建一个Eclipse插件之前,一切都像魅力一样。 然后,思考停止工作。 鉴于我的应用程序在不是Eclipse插件的一部分时工作正常,我认为它应该是一个类加载器问题。 所以我在我的Reflections类中添加了插件激活器类的类加载器,上下文类加载器以及我能想象的所有其他类加载器,没有任何成功。 这是我的代码的简化版本: ConfigurationBuilder config = new ConfigurationBuilder(); config.addClassLoaders(thePluginActivatorClassLoader); config.addClassLoaders(ClasspathHelper.getContextClassLoader()); config.addClassLoaders(“all the classloaders I could imagine”); config.filterInputsBy(new FilterBuilder().include(“package I want to analyze”)); Reflections reflections = new Reflections(config); Set<Class> classes = reflections.getTypesAnnotatedWith(MyAnnotation.class); //this Set is empty 我也尝试将我想加载的类的URL添加到ConfigurationBuilder类,但它没有帮助。 有人能告诉我是否有办法让Reflections作为Eclipse插件的一部分工作?或者我应该更好地寻找另一种替代方案? 非常感谢,我真的很困惑。
假设generics类型声明(Java) class Foo { public T bar; } 我怎样才能在运行时实例化一个Type对象,该对象表示在特定类型T上参数化的Foo(也仅在运行时知道)?
这是一个变量Class cls ,现在我想获得另一个组件类型为cls Array Class Object 。 例如,如果cls = String.class ,我想得到String[].class ; 如果cls = int.class ,我想得到int[].class ,我该怎么办? 你看,从String[].class获取String.class非常容易String[].class : Class arrayCls = String[].class; if(arrayCls.isArray()){ Class cls = arrayCls.getComponentType(); } 但我找不到简单的方法来做相反的事情。 这是一个可能的解决方案: Class clazz = String.class; Class arrayClass = Array.newInstance(clazz,0).getClass(); 请问有什么方法可以做到这一点吗?
我希望用Java来实现一些东西: class Foo{ private int lorem; // private int ipsum; public setAttribute(String attr, int val){ //sets attribute based on name } public static void main(String [] args){ Foo f = new Foo(); f.setAttribute(“lorem”,1); f.setAttribute(“ipsum”,2); } public Foo(){} } …基于变量名设置变量而不使用硬编码的变量名并且不使用任何其他数据结构。 这可能吗?
如何在实现定义接口的类路径中发现运行时的类? ServiceLoader非常适合(我认为,我还没有使用它),但我需要在Java 1.5中使用它。
让我们假设使用reflection检索Field的声明类型。 以下哪个测试将正确指示是否正在处理int或Integer ? Field f = … Class c = f.getDeclaringClass(); boolean isInteger; isInteger = c.equals(Integer.class); isInteger = c.equals(Integer.TYPE); isInteger = c.equals(int.class); isInteger = ( c == Integer.class); isInteger = ( c == Integer.TYPE); isInteger = ( c == int.class);
鉴于: class A { public void m(List l) { … } } 假设我想用reflection调用方法m ,将ArrayList作为参数传递给m : List myList = new ArrayList(); A a = new A(); Method method = A.class.getMethod(“m”, new Class[] { myList.getClass() }); method.invoke(a, Object[] { myList }); 第3行的getMethod将抛出NoSuchMethodException因为myList的运行时类型是ArrayList,而不是List。 有没有一个很好的通用方法,不需要知道A类的参数类型?
可能重复: Java Class.cast()与强制转换运算符 我没有成功地试图找出Class.cast()做什么或它可能有什么好处,同时我想知道我是否可以通过reflection以某种方式投射对象。 首先,我认为下面的行可能是错误的: Object o = “A string”; String str = Class.forName(“java.lang.String”).cast(object); 但如果没有明确的演员,它就行不通。 那么什么是Class类的cast方法呢? 它是否有可能只是通过reflection来投射对象,所以你找到对象的类,在它上面使用Class.forName并以某种方式投射它?
我有两个class: Father和Child public class Father implements Serializable, JSONInterface { private String a_field; //setter and getter here } public class Child extends Father { //empty class } 有了reflection,我想在Child类中设置a_field : Class clazz = Class.forName(“Child”); Object cc = clazz.newInstance(); Field f1 = cc.getClass().getField(“a_field”); f1.set(cc, “reflecting on life”); String str1 = (String) f1.get(cc.getClass()); System.out.println(“field: ” + str1); 但我有一个例外: 线程“main”中的exceptionjava.lang.NoSuchFieldException:a_field […]
现在我有 private static void getMethods(Class clazz) { Method[] declaredMethods = clazz.getDeclaredMethods(); for (Method aMethod : declaredMethods) { aMethod.setAccessible(true); // Print the declaration System.out.print(Modifier.toString(aMethod.getModifiers()) + ” ” + aMethod.getReturnType().getSimpleName() + ” ” + aMethod.getName()); // Get Parameter Types getParameters(aMethod); //Empty Body System.out.println(“{}\n”); } } 其中reflection性地打印大多数信息但创建了空体。 如何添加Java的reflection特性来打印方法体?