Tag: reflection

从类名中动态创建java中的对象,并使用带数据的List设置类字段

我有一个包含String类型数据的List – > [“classField1”, “classField2”, “classField3”] 我有一个方法( myMethod(List list, String className) )接受List作为参数。 所以,我可以通过参数将此List传递给myMethod(List list,String className)。 在myMethod ,我想创建一个对象,它将是className的实例,即第二个参数。 之后,我想通过使用List的数据设置类的字段。 由于我想动态获取类的字段,因此上面的结果是我必须将列表的每个String值转换为类的每个字段的类型。 我确信列表中的字符串顺序是正确的顺序,并且对应于具有相同顺序的类的字段。 有没有人知道如何执行上述操作? 例: [“StringtempValue”, “StringUnitOfMeasurement”] => 创建实例对象: public class TempStruct { private double tempValue; private String unitOfMeasurement; public TempStruct(double tempValue, String unitOfMeasurement) { this.tempValue = tempValue; this.unitOfMeasurement = unitOfMeasurement; } } 我尝试用以下方式提供解决方案: 实际上我想创建一个现有类的对象,我试图用reflection做。 我使用以下代码: Class cls […]

Java中generics参数类的反映?

想象一下以下场景: class MyClass extends OtherClass{ String myName; //Whatever } class OtherClass { T myfield; } 我正在使用特定的reflection分析MyClass (MyClass.class).getDeclaredFields() ,在这种情况下,我将获得以下字段(和类型,使用字段的getType()): myName –> String myField –> T 我想获得T的实际类型,由于扩展符号中的显式“字符串”,它在运行时已知,如何获取myField的非遗传类型? 编辑决议: 似乎答案是“你不能”。 对于那些以后可能会看到这个问题的人,我建议使用Jackson(我试图这样做来生成JSON)并以这样的方式注释你的类和字段,以便jackson知道inheritance层次结构并且可以自动地做什么建议的正确答案如下。

为什么反思慢?

是因为我们应该加载类(例如通过string ),创建实例,然后搜索适当的方法,打包参数,然后只调用方法? 所以大部分时间花在这些操作上而不是对象上的显式方法调用,对吗?

如何观察变量的变量

我想知道是否有任何方法可以在程序运行时观察变量值的变化。 当然不使用调试器我想以编程方式进行 。 例如: class A { public static int valueToBeWatched; } 因此,在运行时,如果在我的项目中的任何类的任何方法中修改此值,则应调用此值MyValueChangeListner事件。

Javareflection:按声明顺序获取字段和方法

有没有办法按照声明的顺序使用reflection获取类声明的字段(和方法)? 根据文档, getFields() , getDeclaredFields()等返回的Methods和Fields的顺序是未定义的。 使用Javareflection中建议的注释可以指定像索引之类的东西:类字段和方法的顺序是否标准化? 有没有更好的选择,即不必手动指定索引? 现在在你问我需要什么之前:我们有一个方法,它将一个非常大的数据结构作为输入,并对其进行冗长的计算。 为了创建unit testing,我们创建了一个方法,该方法接受输入对象和输出实例,并创建Java源代码(设置输入,调用计算方法,然后断言正确的结果)作为输出。 当字段按声明顺序写入时,此代码更易读。

通过reflection调用Java中的getter:重复调用它的最快方法是什么(性能和可伸缩性方面)?

给定一个类Foo和一个属性bar , 我在编译时都不知道 ,我需要多次重复调用getter Foo.getBar() 。 假设我有: Method barGetterMethod = …; // Don’t worry how I got this 我需要做这样的事情: for (Object foo : fooList) { // 1000000000 elements in fooList Object bar = barGetterMethod.invoke(foo); … } 与没有reflection调用它相比,上面的实现仍然很慢。 有更快的方法吗? 用Javareflection调用getter的最快方法是什么?

我可以覆盖Java中的私有方法吗?

我知道我可以使用reflection来调用私有方法,并获取或设置私有变量的值,但我想覆盖一个方法。 public class SuperClass { public void printInt() { System.out.println(“I am ” + getClass() + “. The int is ” + getInt()); } private int getInt() { return 1; } } public class SubClass extends SuperClass { public static void main(String[] args) { (new SubClass()).printInt(); } public int getInt() { return 2; } } 我希望SubClass的main方法打印出2 […]

使用Java中的reflection创建一个新实例,并将引用变量类型设置为新的实例类名称?

我查看reflection的所有示例都显示了创建未知实现的新实例,并将该实现强制转换为它的接口。 这个问题是现在你不能在实现类上调用任何新方法(仅覆盖),因为你的对象引用变量具有接口类型。 这是我有的: Class c = null; try { c = Class.forName(“com.path.to.ImplementationType”); } catch (ClassNotFoundException e) { e.printStackTrace(); } InterfaceType interfaceType = null; try { interfaceType = (InterfaceType)c.newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } 如果我只引用“com.path.to.ImplementationType”,并且我不知道该类型是什么(它来自配置文件),那么我如何使用类名将其强制转换为ImplementationType? 这有可能吗?

Java:循环类路径中的所有类

有没有办法迭代类路径中的所有类? 我想对实现某个接口的一些类进行一些反思性检查,但是我想完全动态地完成它,而不需要检查哪些类,只需浏览类路径。

Java将“.class”-operator用于generics类型,例如List,“Class <List >”和“Class <List >”

我使用.class -operator将有关包含类型的信息提供给generics类。 对于非generics包含的类型,例如Integer.class ,这没有任何问题。 但是由于包含的类型是通用的,例如List.class或List.class它会导致关于类转换的编译时错误。 有办法规避错误,但我很好奇这里发生了什么。 有人可以解释发生了什么吗?为什么事情就像它们一样?以及解决问题的最佳方法是什么? 以下行演示了此问题:请注意,外部generics类型需要Class作为参数,因此在本例中为Class<List> 。 Class tInt = Integer.class; // Works as expected. Class tList = List.class; // Works with warning, but is not // what i’m looking for. Class<List> tListInt1 = List.class; // Error Class<List> tListInt2 = (Class<List>) List.class; // Error Class<List> tListGeneric = (Class<List>) List.class; // Error 下一行有效: Class<List> […]