草庐IT

Reflection

全部标签

java - 有没有一种方法可以在没有代码生成的情况下编写原型(prototype)数据?

我想知道是否可以使用googleprotobuf提供的反射API来序列化消息而无需代码生成?Protocolbuffer允许我们在Message或Message.Builder对象上使用反射在解析过程之后。但就我而言,我想知道是否可以用字段/值填充这些对象,然后将它们写入文件。 最佳答案 编码输出流做到这一点的一种方法是了解messageisencoded并使用CodedOutputStream使用适当的write*()方法编写消息字段。例如编写以下消息:messageMyMessage{intfoo=1;stringbar=2;}

java - 加载包中的每个类

我目前正在使用反射从ClassLoader中的classes字段获取所有加载的类,然后检查getPackage是否等于我正在寻找的包裹。我遇到的一个问题是类没有被ClassLoader加载,但我无法使用Class.forName自己加载它们,因为我赢了'知道类的名称,因为它们是动态加载的并且总是在变化。这些类的共同点之一是它们扩展了Module。我将如何从一个包中加载所有类?提前致谢。 最佳答案 使用reflectionsAPI它肯定有效。如果没有,您可能会以错误的方式设置它。我刚刚编写了这个示例,它独立于任何类加载器打印包中的所有

java - 通过 Dijkstra 算法中私有(private)方法的 JUnit 测试用例

我正在尝试找出为类练习实现测试用例的最佳方法。我的类练习提供了已知的错误,因此我应该编写一个测试用例使其失败,从而找到错误。它涉及使用Dijkstra算法。这是所提供代码的正确版本:privateintgetNodeWithMinimumDistanceFromUnsettled(){intmin;intnode=0;Iteratoriterator=unsettled.iterator();node=iterator.next();min=distances[node];for(inti=1;i单独版本已知bug如下:if(unsettled.contains(i)){if(dist

java - 保护字段免受反射 - System.security 的奇怪案例

我目前正在研究Java安全性并遇到了一个奇怪的现象。java中的SecurityManager存放在java.lang.System中的“security”字段中。有趣的是,该字段似乎受到保护以防止反射访问,这确实有意义,但据我所知,该字段是唯一的。所以这里是例子:for(Fieldf:System.class.getDeclaredFields())System.out.println(f);输出publicstaticfinaljava.io.InputStreamjava.lang.System.inpublicstaticfinaljava.io.PrintStreamjava

java - 如何在编译时获取方法名称?

如何在编译时获取封闭的方法名称?为什么我很难弄明白这一点?为什么Java不希望我这样做?我没有看到像这样的功能有任何固有问题,它对于记录方法名称很有用,而不会像这样在方法签名和字符串常量之间重复:privatevoidmethodName(){finalStringMN="methodName";...有人可能改了方法名却没有改MN常量,然后我在日志中就找不到了。我知道Java有一个(反射性的?)方法来执行此操作,但为什么有人会想要使事情过于复杂并使用运行时解决方案(针对这个特定问题)创造错误的可能性,这超出了我的理解范围。显然宏是不好的做法,但我认为这对他们来说是一个很好的用例。这就

java - 反射安全

如何通过不允许Method来加强反射安全,Field,Constructor对象调用setAccessible(true)?SecurityPolicy文件还是其他?通常对于独立的Java应用程序没有SecurityManager已注册。我用这个System.setSecurityManager(newSecurityManager());这种方法适用于调用方法。我想强制执行整个jar或使用该jar的客户端代码不允许调用setAccessible(true);有什么更好的方法吗?谢谢。 最佳答案 嗯,它确实适用于setAccessi

java - 在 Java 中,在泛型实例上调用 getClass 时如何避免原始类型?

假设我在Java中有这个:Listlist=newArrayList();list.getClass();最后一个表达式的类型是Class.我明白为什么,由于删除,它不能是Class>.但是为什么不能是Class>呢??如果我想将这个表达式的结果分配给一个以某种方式保持该类实际上是某种类型的信息List?ClasslistClass=list.getClass();//rawtypewarningClass>listClass=(Class>)list.getClass();//uncheckedcastwarning 最佳答案 首

java - 不使用反射访问类的字段?

有没有一种方法可以在不使用反射的情况下访问类中的特定Field?考虑这个类:classMyType{publicinttheNumber;}我想在哪里访问theNumber的java.lang.reflect.Field。这肯定有效:Fieldf=MyType.class.getDeclaredField("theNumber");但是,我想对字段名称进行编译检查,所以理想情况下是这样的(但当然我的示例无法编译):Fieldf=MyType.class::theNumber;这是可能的还是我的编译器能力? 最佳答案 您可以使用注解处

java - 如何使用反射获取参数类型?

我想使用具有不同数量参数的函数。问题是我不知道每个函数的参数数量,也不知道函数名称,因为它们存储在数组中。我只知道类名,但不想使用getDeclaredMethods,因为它会增加搜索时间。有没有办法获取每个函数的参数类型? 最佳答案 当我不得不查找方法时,我通常做的是从我正在做的查询中生成一个缓存键,并将带有这个缓存键的搜索结果保存在一个映射中。例子:我知道方法参数是Boolean.TRUE、Arrays.asList("foo","bar","baz")和BigInteger.valueOf(77777l)我的类包含一个带有签名

java - hibernate :在运行时创建实体(带注释)

是否可以在运行时创建hibernate实体类(带注释)?它应该与也在运行时添加的表相关。实体应该对Hibernate可见,这一点很重要。一般来说有可能吗,请你给我一些关于这个问题的建议吗?我明白,反射(reflection)是关键词,但要找更多的词。问候。 最佳答案 在这种情况下,您可能希望在运行时以编程方式创建Hibernatesession工厂,传入您创建的新映射,查看http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/session-configuration.h