草庐IT

Reflection

全部标签

java - 拦截方法调用

我有这个代码Foofoo=newFoo();foo.callTheMethod();有什么方法可以拦截Foo.callTheMethod()调用而无需子类化或修改Foo类,并且无需Foo工厂?编辑:抱歉忘记提及这是在Android平台上。 最佳答案 使用Java的Proxy类(class)。它创建接口(interface)的动态实现并拦截方法,所有这些都是反射性的。这是一个tutorial. 关于java-拦截方法调用,我们在StackOverflow上找到一个类似的问题:

java - 我可以在不将类名硬编码为字符串文字的情况下将类名作为编译时常量获取吗?

我正在研究注释处理器。此代码编译:packagesand;importjava.util.Set;importjavax.annotation.processing.AbstractProcessor;importjavax.annotation.processing.RoundEnvironment;importjavax.annotation.processing.SupportedAnnotationTypes;importjavax.lang.model.element.TypeElement;@SupportedAnnotationTypes("sand.Foo")publi

java - 多次调用 Method/Field.getAnnotation(Class) 与在 Map 中预缓存此数据的性能

我想知道是否有任何关于重复调用(在Java中)Method.getAnnotation(Class)和Field.getAnnotation(Class)的性能的比较/研究方法,而不是存储(在程序启动时)具有类元数据信息的预计算Map并稍后重复查询。哪一个可以提供最佳的运行时性能?这个性能在Java5、6和7下是否相同? 最佳答案 Map应该是更可取的方法。主要问题不仅与缓存有关。还能改善多线程争用。在Method.getAnnotation()中,它调用同步私有(private)方法declaredAnnotations()。同步

java - 如何在 Java 中获取给定类的数组类?

我有一个包含特定类型的Class变量,我需要获取一个包含相应数组类的变量。我能想到的最好的是:ClassarrayOfFooClass=java.lang.reflect.Array.newInstance(fooClass,0).getClass();有没有办法在不创建新实例的情况下做到这一点? 最佳答案 从Java12开始Class提供了一个方法arrayType(),它返回其组件类型由给定类描述的数组类型类。请注意individualJDK仍然可以创建该类³的实例。ClassstringArrayClass=FooBar.ar

c# - 是否有等效于 Java 的 ToStringBuilder for C#?一个好的 C# 版本有什么特点?

在Java世界中,我们有ApacheCommons'ToStringBuilder帮助创建toString()实现。有人知道C#的一个不错的免费实现吗?有没有我不知道的更好的选择?如果不存在免费的实现,那么我猜这个问题就变成了一个“在C#3中什么是好的ToStringBuilder?”在我的脑海中:它可以提供反射和手动创建ToString字符串。如果它能利用表达式树,那就太棒了。像这样的..publicoverridestringToString(){returnnewToStringBuilder(this).Append(t=>t.Id).Append(t=>t.Name).ToS

java - 有没有类似Java 1.5中的ServiceLoader的东西?

如何在运行时发现类路径中实现已定义接口(interface)的类?ServiceLoader很适合(我想,我没用过),但我需要在Java1.5中使用它。 最佳答案 Java1.5中没有为此内置任何内容。我自己实现了;这不是太复杂。但是,当我们升级到Java6时,我将不得不将对我的实现的调用替换为对ServiceLoader的调用。我本可以在应用程序和加载程序之间定义一个小桥梁,但我只在几个地方使用它,而包装器本身将是ServiceLoader的一个很好的候选者。这是核心思想:publicIterableload(Classifc)t

java - 如何从基类实例中找出子类?

有没有办法从基类实例中找出派生类的名称?例如:classA{....}classBextendsA{...}classcextendsA{...}现在如果一个方法返回一个A的对象,我能找出它是B还是C类型吗? 最佳答案 使用instanceof或Class#getClass()Areturned=getA();if(returnedinstanceofB){..}elseif(returnedinstanceofC){..}getClass()将返回以下任一个:A.class、B.class、C.class在if子句中你需要向下转型

java - 在 Java 中按名称设置变量

我希望按照以下方式在Java中实现一些东西:classFoo{privateintlorem;//privateintipsum;publicsetAttribute(Stringattr,intval){//setsattributebasedonname}publicstaticvoidmain(String[]args){Foof=newFoo();f.setAttribute("lorem",1);f.setAttribute("ipsum",2);}publicFoo(){}}...其中变量是根据变量名设置的,变量名没有硬编码,也没有使用任何其他数据结构。这可能吗?

java - 从类名动态创建 java 对象,并使用带有数据的列表设置类字段

我有一个包含字符串类型数据的列表->["classField1","classField2","classField3"]我有一个接受List作为参数的方法(myMethod(Listlist,StringclassName))。所以,我可以通过参数将这个List传递给myMethod(Listlist,StringclassName)。在myMethod中,我想创建一个对象,它将是className的实例,即第二个参数。之后我想通过使用列表的数据来设置类的字段。由于我想动态获取类的字段,上面的结果是我必须将列表的每个String值转换为类的每个字段的类型。我确信List中的字符串的顺

java - 具体类的动态代理

我想在Java程序中定义一个方法拦截器,换句话说,我想在每次方法调用时执行一个行为。该应用程序不在应用程序服务器中执行,因此我不能在调用拦截器周围使用EJB。我找到了一个不错的Proxy标准Java库中的API但它的限制是因为它需要在代理创建中的接口(interface):Foof=(Foo)Proxy.newProxyInstance(Foo.class.getClassLoader(),newClass[]{Foo.class},handler);是否有类似的API不强制将Foo.class声明为接口(interface)? 最佳答案