Tag: reflection

拦截方法调用

我有这个代码 Foo foo = new Foo(); foo.callTheMethod(); 有没有什么方法可以拦截Foo.callTheMethod()调用而无需子类化或修改Foo类,并且没有Foo工厂? 编辑:抱歉忘了提到这是在Android平台上。

运行JUnit @Test方法的子集

我们使用JUnit 4进行测试:我们的类不是TestCase的子类,并且它们具有使用@Test注释的公共方法。 我们有一个包含许多@Test方法的文件。 能够通过命令行中的Ant运行它们的子集会很好,这是JUnit 3的这个配方的样式: ant runtest -Dtest=MyTest -Dtests=testFoo,testBar http://today.java.net/pub/a/today/2003/09/12/individual-test-cases.html 我一直试图想办法用Javareflection等来实现这一点。因为似乎没有任何方法可以“隐藏” @Test方法或在运行时删除它们的注释,唯一的选择似乎是使用ClassLoader的defineClass方法,看起来相当困难。 PS在这种情况下,正确的事情是分割文件,但有其他选择吗? 谢谢你的时间。

从通用基接口的实例中检索类型参数

给出2个接口: public interface BaseInterface { } public interface ExtendedInterface extends BaseInterface {} 和一个具体的类: public class MyClass implements ExtendedInterface { } 如何找到传递给BaseInterface接口的type参数? (我可以通过调用类似的东西来检索ExtendedInterface类型参数 MyClass.class.getGenericInterfaces()[0].getActualTypeArguments() 但我无法找到一种简单的方法来递归到任何基础通用接口并得到任何有意义的东西)。

嵌套类的构造函数的问题

这个问题是关于Java的有趣行为:它在某些情况下为嵌套类生成了额外的(非默认的)构造函数。 这个问题也是关于奇怪的匿名类,Java用这个奇怪的构造函数生成。 请考虑以下代码: package a; import java.lang.reflect.Constructor; public class TestNested { class A { A() { } A(int a) { } } public static void main(String[] args) { Class aClass = A.class; for (Constructor c : aClass.getDeclaredConstructors()) { System.out.println(c); } } } 这将打印: a.TestNested$A(a.TestNested) a.TestNested$A(a.TestNested,int) 好。 接下来,让构造函数A(int a)私有: private A(int a) { } 再次运行程序。 接收: […]

深reflection比较等于

我试图通过比较结果对象与原始对象来validation序列化和反序列化例程。 例程可以序列化任意和深度嵌套的类,因此我想要一个比较例程,可以给出原始和最终实例,并反过来遍历每个值类型并比较值,并迭代地潜入引用类型以比较值。 我已经尝试过Apache Commons Lang EqualsBuilder.reflectionEquals(inst1, inst2)但这似乎没有进行非常深入的比较,它只是比较参考类型的相等性,而不是深入研究它们: 以下代码说明了我的问题。 对reflectionEquals的第一次调用返回true,但第二次返回false。 是否有人可以推荐的图书馆例程? class dummy { dummy2 nestedClass; } class dummy2 { int intVal; } @Test public void testRefEqu() { dummy inst1 = new dummy(); inst1.nestedClass = new dummy2(); inst1.nestedClass.intVal = 2; dummy inst2 = new dummy(); inst2.nestedClass = new dummy2(); inst2.nestedClass.intVal = 2; boolean isEqual = EqualsBuilder.reflectionEquals(inst1.nestedClass, […]

如何reflection性地调用Java 8默认方法

鉴于这个简单的“Hello World”ish Java 8接口,如何通过reflection调用其hello()方法? public interface Hello { default String hello() { return “Hello”; } }

有没有办法在Java中获取方法参数的名称?

我正在编写小而非常DRY的框架,它严重依赖于元数据。 我想知道是否有办法获取方法参数名称,即给定一些方法 public void a(int myIntParam, String theString) { … } 得到字符串”myIntParam”和”theString” 。 我知道我可以注释参数,但这不会很好…… public void a( @Param(“myIntParam”) int myIntParam, @Param(“theString”) String theString ) { … }

有什么方法可以进一步优化Javareflection方法调用?

我想知道是否有任何额外的优化我可以实现以提高Java中reflection调用的速度。 并不是说性能是令人望而却步的,但是我在考虑库中的某些代码时会得到一些我正在编写的代码在某个地方实现紧密循环。 考虑一种reflection性调用的实用方法: public static Object invoke(Object targetObject, String methodName, Object[] arguments, Class[] signature) 基本操作是 return method.invoke(targetObject, arguments); 作为性能优化,我使用目标对象的类,方法名称和签名(其代码可能会使用某些改进)的哈希来缓存方法,但除此之外,还有什么我可以做的吗? 我听说过InvokeDynamic的一些早期实现的参考听起来很有希望,但我只是假设它们可能还不适用,并且我打算使用自己的字节代码操作,因为我希望保持实用程序简单(但速度快)。 干杯。

从字符串加载类

我想通过String的值来实例化一个类。 我找到了几个教程,展示了这样做的几种方法。 该类必须从某个接口inheritance, ImplementMe有一个名为runMe()的特殊方法。 所以这就是我的尝试: ImplmentMe a = (ImplementMe) ImplementMe.class .getClassLoader() .loadClass(“my.package.IImplementedYou”) .newInstance(); a.runMe(); 它有效,但它太丑了。 我至少预计不需要演员。 请告诉我有更好的方法。

Void真的不可以实现吗?

Void的javadoc说: Void类是一个不可实例化的占位符类,用于保存对表示Java关键字void的Class对象的引用。 但构造函数很简单: private Void() {} 并且此代码实例化了一个Void : Constructor c = Void.class.getDeclaredConstructor(); c.setAccessible(true); Void v = c.newInstance(); // Hello sailor 所以Void 不是不可实现的。 是否有办法让Void真正无法实现?