草庐IT

Reflection

全部标签

java - Type 类型层次类型应该如何实现?

当泛型被添加到1.5时,java.lang.reflect添加了一个Type与各种子类型接口(interface)以表示类型。Classretrofit以实现Type对于pre-1.5类型。Type子类型可用于1.5的新泛型类型。这一切都很好。有点尴尬Type必须沮丧才能做任何有用的事情,但可以通过试验、错误、摆弄和(自动)测试来实现。除非涉及到实现......应该怎样equals和hashCode予以实现。ParameterizedType的API描述Type的子类型说:Instancesofclassesthatimplementthisinterfacemustimplement

java - 哪个 java.lang.Class 方法为 Class.forName() 生成正确的输入?

我想写一些这样的代码:Objecto=...;StringoTypeName=o.getClass().getName();//ontheothersideofthewire:ClassoClass=Class.forName(oTypeName);ObjectoAgain=oClass.newInstance();但是,从javadoc中不清楚我应该使用哪种方法来初始化oTypeName,即哪种方法将产生预期的输入Class.forName():getCanonicalName():"返回由Java语言规范定义的底层类的规范名称。如果底层类没有规范名称(即,如果它是本地类或匿名类或其

java - 用反射覆盖最终静态字段是否有限制?

在我的一些单元测试中,我遇到了在最终静态字段上反射的奇怪行为。下面是一个说明我的问题的例子。我有一个包含整数的基本单例类publicclassBasicHolder{privatestaticBasicHolderinstance=newBasicHolder();publicstaticBasicHoldergetInstance(){returninstance;}privateBasicHolder(){}privatefinalstaticIntegerVALUE=newInteger(0);publicIntegergetVALUE(){returnVALUE;}}我的测试用

java、反射、性能等

所以我知道这个主题以前已经做过,例如JavaReflectionPerformance,但我的具体问题是,似乎许多流行的库都是通过注释和反射实现的(例如Gson、Jackson、Jaxb实现、hibernate搜索)。许多(如果不是全部)库即使使用反射也能提供良好(或出色)的性能。我的问题是,他们是怎么做到的?是否有一些“技巧”需要知道,或者他们只是使用直接反射,而对性能的担忧被夸大了?编辑:例如,当我们写:MyObjectobj=newGson().fromJson(someInputStream,MyObject.class);我可以理解库如何在内部缓存Field对象,但在我看来,

java - 我可以反射性地实例化 java 中的泛型类型吗?

是否可以在Java中反射性地实例化泛型类型?使用描述的技术here我得到一个错误,因为类标记不能是通用的。以下面的例子为例。我想实例化一些实现Creator的Creator子类。实际的类名作为命令行参数传入。这个想法是能够在运行时指定Creator的实现。还有其他方法可以完成我在这里尝试做的事情吗?publicinterfaceCreator{Tcreate();}publicclassStringCreatorimplementsCreator{publicStringcreate(){returnnewString();}}publicclassFancyStringCreator

java - LoggerFactory.getLogger(ClassName.class) 与 LoggerFactory.getLogger(this.getClass().getName())

我正在努力提高我的Java优化技能。为了实现这一目标,我制作了一个旧程序,我正在尽最大努力让它变得更好。在这个程序中,我使用SL4J进行日志记录。为了获得记录器,我做了:privatestaticfinalLoggerlogger=LoggerFactory.getLogger(this.getClass().getName());在我编写代码时,我认为这是最好的选择,因为我删除了对类名的引用(可能会被重构)。但现在我不再那么确定了......privatestaticfinalLoggerlogger=LoggerFactory.getLogger(ClassName.class);

java - 有什么好方法可以让两个不可变对象(immutable对象)互相引用?

采用这两个Java类:classUser{finalInventoryinventory;User(Inventoryinv){inventory=inv;}}classInventory{finalUserowner;Inventory(Userown){owner=own;}}有什么办法withoutusingreflection*把它拉下来?我实际上并不期望它是,但问问也无妨。更新:因为在字节码构造中有两个步骤(1.分配对象,2.调用构造函数**)这是否可以(ab)用于执行此操作,使用手写字节码或自定义编译器?我说的是首先对两个对象执行步骤1,然后对两个对象执行步骤2,使用步骤1

java - Class.forName() 缓存

在我的一个应用程序中,我使用了以下内容:publicvoidcalculate(StringclassName){...Classclazz=Class.forName(className);...}这个函数每秒被调用几次。大约有10个可能的类名。虽然我确实意识到这个函数中有一些内部缓存,我认为这种缓存仅在native级别可用。出于这个原因,我开始考虑是否应该添加自己的缓存。privatestaticMapclassMap;publicvoidcalculate(StringclassName){...Classclazz=classMap.get(className);if(claz

java - 运行时获取jar版本

我想知道是否有可能在运行时检索类所来自的jar的版本号?我知道可以找到该类来自的jar:MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath();但是版本呢?(假设它不在文件名中:)) 最佳答案 试试这个,它可能会有帮助:Strings=newString();System.out.println(s.getClass().getPackage().getSpecificationVersion());System.out.println(

java - 使用反射的 IllegalAccessException

我在尝试学习反射时遇到了这个IllegalAccessException。请看下面的代码:publicclassReflectionTest{publicstaticvoidmain(String[]args){SetmyStr=newHashSet();myStr.add("obj1");Iteratoritr=myStr.iterator();Methodmtd=itr.getClass().getMethod("hasNext");System.out.println(m.invoke(it));}}当我尝试运行这个程序时,我得到了以下信息:Exceptioninthread"m