草庐IT

Reflection

全部标签

java - java.lang.reflect.Method.equals(Object obj) 中的名称比较

下面是Java7中java.lang.reflect.Method.equals(Objectobj)的实现:/***Comparesthis{@codeMethod}againstthespecifiedobject.Returns*trueiftheobjectsarethesame.Two{@codeMethods}arethesameif*theyweredeclaredbythesameclassandhavethesamename*andformalparametertypesandreturntype.*/publicbooleanequals(Objectobj){if

java - 仅使用私有(private)构造函数扩展类

问题是:我有一个只有私有(private)构造函数可用的类(我不能修改它的源代码),我需要扩展它。由于反射允许我们在需要时创建此类的实例(通过获取构造函数并调用newInstance()),是否有任何方法可以创建此类的扩展版本的实例(我的意思是,真的有任何方法,即使它反对OOP)?我知道,这是一个不好的做法,但看起来我别无选择:我需要拦截对一个类的一些调用(它是一个单例,它不是一个接口(interface)实现,所以动态代理在这里不起作用).最小示例(按要求):publicclassSingleton{staticprivateSingletoninstance;privateSing

Java : programmatically determine all of the package names loaded on the classpath

关于如何找到当前类路径中存在的包名称列表,有什么建议吗?这需要在运行时通过在类路径上加载(和执行)的类之一以编程方式完成(即由内而外,而不是由外而内)。更多详情:我考虑的一种方法是对类加载器到目前为止加载的每个类使用反射,并从中提取包名称。但是,我的应用程序已经运行了数千个类,因此我需要一种更高效的方法。我考虑的另一件事类似于找出类路径中的JAR文件,然后为每个JAR并行列出目录。但是,我不知道这是否可以从应用程序内部实现/如何实现。奖励积分任何建议可以按顶级包过滤的方法的人都可以获得奖励积分。例如。显示com.xyz下的所有包==>com.xyz.*,com.xyz.*.*谢谢!

java反射创建字段/值 HashMap

我需要创建包含在实体中的字段/值的Hashmap,这样我就可以使用它们在包含带有字段名称的标签的字符串中替换它们。我有这个代码:publicstaticStringreplaceTags(Stringmessage,Maptags)...用tags中的等效值替换message中找到的所有标签,但为了构建Maptable我需要采取“任何”实体,并能够从该实体创建map。那么,我怎样才能做到这一点呢?获取我发送实体并返回包含所有字段和值的映射的例程。publicstaticMapgetMapFromEntity(Objectentity){Mapmap=newHashMap();...??

Java 反射和重构的痛苦

Java反射提供了一种在运行时自省(introspection)对象的机制。没有第二个想法,这是一个很棒的功能,但它打破了所有重构约定!即使在现代IDE中也没有简单的方法(除了FileSearch)来知道引用了哪个属性以及引用的位置。这使得重构变得更加复杂(令人厌烦!)并且容易出错。坦率地说,不仅仅是ReflectionAPI;Hibernate映射文件(hbm.xml)和JSP文件都将属性引用为字符串,当您重构属性名称时,您必须在所有这些地方手动更改.更糟糕的是,Hibernate映射文件或JSP文件中的更改会导致运行时错误。我很想知道其他程序员如何用Java处理这个问题。有一些工具

java - 在 Java 中可以访问方法 "reflectively"的源代码吗?

恐怕答案是否定的,但也许你们中的一个让我感到惊讶。谢谢。编辑1:我知道这个问题没有多大意义,但我认为这一点已被理解,遗憾的是,答案是否定的。无论如何,我更改了问题的标题,为“反射(reflection)”一词添加了引号,为了以防万一,我会尝试更好地解释我的意图。我有一个类型的实例,它是具有一些已知方法的某个抽象类型的子类。我想在运行时获得一个字符串,其中包含实例类型中此类方法之一的实际实现的源代码。我认为值得指出的是实例的实际类型可能是一个匿名内部类....另外,源代码的“反编译”版本就足够了。我想获取源码的方法,大多数时候只有一行....谢谢。 最佳答案

java - Clojure 中函数的类型提示

我正在尝试解决Clojure中的反射警告,该警告似乎是由于对作为普通Java对象的函数返回值缺乏类型推断而导致的。演示该问题的简单示例代码:(set!*warn-on-reflection*true)(defnfoo[#^Integerx](+3x))(.equals(foo2)(foo2))=>Reflectionwarning,NO_SOURCE_PATH:10-calltoequalscan'tberesolved.true解决这个问题的最佳方法是什么?这可以通过类型提示来完成吗? 最佳答案 这两个版本似乎有效:user>(d

java - 为什么我的自定义 SecurityManager 在第 16 次使用 Constructor.newInstance 创建对象时会导致异常?

我目前正在开发一个小型Java应用程序,其中受信任的代码必须与不受信任的代码一起运行。为此,我安装了一个自定义的SecurityManager,它会在检查权限时抛出SecurityException。作为可信代码和不可信代码之间的桥梁,我有一个线程使用Constructor.newInstance()来实例化一个不可信类型的对象。在进行此调用时,安全管理器配置为阻止所有内容。有趣的是,前15次我尝试使用Constructor.newInstance()创建对象时,一切正常,但第16次我遇到了SecurityException。我已经设法将其归结为一个简单的测试程序:importjava

java - 更改 JIT 编译的最终值

我注意到一件非常奇怪的事情,即在通过反射更改最终字段后,返回该字段的方法始终给出旧值。我想这可能是因为JIT编译器。示例程序如下:publicclassMain{privatestaticfinalMainm=newMain();publicstaticMaingetM(){returnm;}publicstaticvoidmain(Stringargs[])throwsException{Mainm=getM();intx=0;for(inti=0;i结果是:Main@1be6f5c3Main@1be6f5c3Main@6b884d57我想知道,如何让getM()返回更新后的值?

java - 如何防止通过反射访问?

在Java文档中它提到使用f.setAccessible(true)方法我们可以违反封装原则。但是如果我正在编写任何具有完全安全性的类,例如使用私有(private)变量,我如何防止它被反射访问?例如,我有一个具有完全安全实例变量的类:publicfinalclassImmutable{privatefinalintsomeVal;publicImmutable(intsomeVal){this.someVal=someVal;}publicintgetVal(){returnsomeVal;}}但是我可以像这样使用反射修改那个实例变量:publicclassTester{public