Tag: reflection

Class.getConstantPool()

如果从rt.jar库反编译java中的java.lang.Class类,您会注意到有一个本机方法声明: native ConstantPool getConstantPool(); 我前一段时间使用Sun的.class文件规范进行类反编译,我能够从每个.class文件中获取常量池记录。 但这实际上是反编译类。 只是我很惊讶在Class类中看到这个签名。 所以我做的是在Main()方法中写了一小段代码: ConstantPool cp = new ConstantPool(); cp.getMethodAtIfLoaded(0); 如果您反编译sun.reflect.ConstantPool类,您会注意到它有很多与类,方法,参数,声明的字段等相关的方法。 当我执行应用程序时,我收到此HotSpotexception: # # An unexpected error has been detected by HotSpot Virtual Machine: # # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6d7e01d3, pid=2816, tid=5464 # # Java VM: Java HotSpot(TM) Client VM (1.5.0_15-b04 mixed mode) # Problematic frame: # V [jvm.dll+0xa01d3] # # […]

为什么Java lamdareflection性能会变差

我构建了一个简单的测试,用Java LambdaMetafactory测量类reflection的性能。 根据各种post,使用LambdaMetafactory的reflection与直接调用getter一样快。 这似乎是最初的,但过了一段时间性能下降。 其中一个测试节目(这似乎是大势所趋): 原来: GET – REFLECTION: Runtime=2.841seconds GET – DIRECT: Runtime=0.358seconds GET – LAMBDA: Runtime=0.362seconds SET – REFLECTION: Runtime=3.86seconds SET – DIRECT: Runtime=0.507seconds SET – LAMBDA: Runtime=0.455seconds 最后: GET – REFLECTION: Runtime=2.904seconds GET – DIRECT: Runtime=0.501seconds GET – LAMBDA: Runtime=5.299seconds SET – REFLECTION: Runtime=4.62seconds SET – DIRECT: Runtime=1.723seconds SET – LAMBDA: Runtime=5.149seconds […]

尝试重新定义sun.reflect.GeneratedMethodAccessor1时,ByteBuddy失败

在好奇心的驱使下,我试图导出GeneratedMethodAccessor1的字节码(使用reflection时由JVM生成)。 我尝试通过以下方式获取类的字节码: public class MethodExtractor { public static void main(String[] args) throws Exception { ExampleClass example = new ExampleClass(); Method exampleMethod = ExampleClass.class .getDeclaredMethod(“exampleMethod”); exampleMethod.setAccessible(true); int rndSum = 0; for (int i = 0; i < 20; i++) { rndSum += (Integer) exampleMethod.invoke(example); } Field field = Method.class.getDeclaredField("methodAccessor"); field.setAccessible(true); Object methodAccessor = field.get(exampleMethod); Field delegate […]

可以使用Excel文件中声明的数据填充Java对象的库

我想知道是否有任何工具/库可以用Excel电子表格中的数据填充Java对象。 我的想法就像你有一个Excel电子表格,第一行包含目标Java对象中具有字段镜像名称的列名。 所有其他行都是数据,因此库将采用用于实例化对象的类,并使用与Excel文件中的行一样多的实例填充列表。 有这样的东西吗?

ToStringBuilder.reflectionToString(Object)以什么格式显示日期?

ToStringBuilder.reflectionToString(Object)以什么格式显示日期? 根据Apache Commons Lang 2.4文档 , ToStringBuilder.reflectionToString(Object)委托给ReflectionToStringBuilder.toString(Object) ,“使用默认的ToStringStyle通过reflection构建toString值”。 那么,默认的ToStringStyle显示日期的格式是什么?

Java中的“特殊属性/属性”而不是getter / setter,以避免锅炉板代码

介绍 我正在开发一个开源项目Treez ,我在树视图中组织了所谓的“Atoms”。 这些Atom有时具有很多属性 ,这些属性可以通过树视图中的用户操作或Eclipse代码编辑器中的API进行修改。 我的Atoms本身的属性由可重用的“AttributeAtoms”表示 。 那些包含实际属性值并提供诸如validation之类的附加function(“Atom”的其他可能术语可能是“小部件”,“bean”,“属性”或“树节点”)。 问题(S) 在过去,我为每个Atom属性提供了一个getter / setter对。 这是一项额外的工作,它会增加我的Atom类的大小(参见下面的代码示例)。 现在我正在寻找一种替代解决方案 使创建新Atoms的工作量减少(维护它们的工作量减少)。 避免“冗余”的getter / setter锅炉板代码。 我将在下面介绍几个选项。 你会使用哪个选项? 您有关于如何改进这些选项的建议吗? 你还知道更多的选择吗? Getter / Setter代码示例 private AttributeAtom myAttribute = new FilePathAttributeAtom(“myAttribtue”); public String getMyAttribute() { return myAttribute.getValue(); } public void setMyAttribute(String value) { this.myAtrribute.setValue(value); } 相关文章 java有类似于C#属性的东西吗? (没有)Java中的属性? http://blog.netopyr.com/2011/05/19/creating-javafx-properties/ http://www.eclipse.org/forums/index.php/t/781816/ 为什么要使用getter和setter? 使用getter和setter的私有属性有什么好处? 考虑的选择 A.使用IDE自动生成getter / […]

在Java中创建带注释的对象时收到通知

意图 我有一个自定义的Java注释: @DynamicField public class RESTEndpointInvoker { @DynamicField(key=”httpTimeout”) private long httpTimeout = 8000L; public void setHttpTimeout(long t){ this.httpTimeout = t; } 当有人更改与带注释的字段对应的文件或数据库中的值时,为具有该属性的所有实例调用setter以反映新值。 因此,我需要跟踪在地图或其他内容中使用注释的所有实例,以便在外部发生更改时更新它们: Map<Key,List> 注意:我打算使用某种forms的WeakHashMap()来避免保持对陈旧实例的引用。 题 如果我不控制何时以及如何创建这些实例,如何跟踪带注释但任意的实例? 理想情况下,我希望在创建实例时收到通知。 试着 我可以扫描类路径中的类类型 ,然后在每个类中搜索带注释的字段(见下文),但我不确定如何跟踪实例。 //get classes with annotation Reflections r = new Reflections(“com.foo”, new TypeAnnotationsScanner()); Set<Class> allAnnotated = r.getTypesAnnotatedWith(DynamicField.class); //identify fields for(Class cls : allAnnotated){ for(Field field : […]

使用javareflection在scala中获取具有特定注释的方法参数

我使用aspectj在scala使用aop。 我有一个方法 def delete(@Id id:Long, name:String) 如何在Aspect文件中获取id的值。 @Around(“execution (* com.myapp.Employee.delete(..))”) def message(joinPoint: ProceedingJoinPoint): Object = { val methodSignature =joinPoint.getSignature.asInstanceOf[MethodSignature] //get the value of the field id joinPoint.proceed } 我无法获得价值。 如果我试试 val res = methodSignature.getMethod.getParameterAnnotations res.map(annotations => println(“size = “+annotations.length)) 始终将大小打印为0。 编辑:现在我正确的大小。 该方法是object 。 但我认为javareflection读取object存在一些问题。 我换了class ,现在能够得到注释。 但是,如何获取使用该注释注释的参数?

Java:懒惰加载Singleton和reflection攻击?

如果我通过holder idiom或double checked lock实现Singleton,而不是调用’getInstance()’,使用reflection实例化它,然后在其上调用’getInstance()’,这将创建两个实例,打破模式。 所以我在类中添加一个静态’counter’成员,在类的私有构造函数中递增它,如果它超过’1’则抛出exception。 但在这种情况下,如果我首先通过reflection进行实例化,那么没有其他人能够在不抛出exception的情况下调用’getInstance()’。 那么我如何懒惰加载Singleton但却阻止它受到这次攻击呢? (我知道’Enum’模式,但有些人觉得它实际上是一个黑客。检查对这个接受的答案的评论: 这个Singleton是否对序列化和reflection攻击都有抵抗?顺便说一句,我的问题是不同的)。 编辑:我认为在DCL的情况下,通过使用静态计数器字段,基于类的同步构造函数并将“this”分配给静态成员,可以防止它。 但是,不确定如何在持有人成语的情况下防止它。

从lambda对象获取MethodHandle

来自java.lang.invoke.LambdaMetafactory : 用于评估lambda表达式的推荐机制是将lambda体转移到方法,调用invokedynamic调用站点,其静态参数列表描述function接口的唯一方法和desugared实现方法,并返回一个对象(lambda对象)实现目标类型。 从检查来看,这至少是Oracle JDK的作用。 我的问题:给定一个lambda对象有没有办法找到实现方法的名称(或句柄)? 或者,给定一个实现方法列表,有没有办法告诉哪一个对应于给定的lambda对象?