Tag: reflection

Javareflection和检查exception

我有一个方法,我想通过反思来调用。 该方法对其参数进行了一些不同的检查,并且可以抛出NullPointer和IllegalArgumentexception。 通过Reflection调用方法也会抛出需要捕获的IllegalArgument和NullPointerexception。 有没有办法确定exception是由reflectionInvoke方法还是由方法本身引起的?

重写方法上的Java Class.getMethods()行为

在Java中使用reflection编写一个简单的JSON序列化程序时,我对Class.getMethods()的行为感到措手不及。 如果重写方法的返回类型扩展了重写方法的返回类型,则Java Class.getMethods()似乎返回覆盖和重写方法。 所以例如给定接口: static interface A { A x(); A y(); } static interface B extends A { B x(); A y(); } A.class.getMethods()按预期返回两个方法的数组,但是B.class.getMethods()返回一个包含3个方法的数组(对我来说这是一个有点反直觉)。 在3中,1对应于预期的y() ,但其余两个分别对应于具有返回类型A的原始x()和具有返回类型B的x()的覆盖版本。 这让我感到有些奇怪,但由于无法从任何地方访问,因此数组中的原始x() 。 无论如何我的问题是: 有没有简单的方法来获取类的方法的最专业版本的列表,而无需手动检查重写方法并过滤掉它们?

是否可以在给定Class ?

我有一个Class Class并尝试调用newInstance()但是Java因为我无法实例化接口的明显原因而对我大吼大叫。 但我知道像EasyMock这样的框架完全能够实例化接口。 从我的Class获取一个完全愚蠢的Annotation实例需要什么?

Java中的类型安全方法reflection

是否有任何实用的方法以类型安全的方式引用类的方法? 一个基本的例子是,如果我想创建类似以下实用程序函数: public Result validateField(Object data, String fieldName, ValidationOptions options) { … } 为了打电话,我必须这样做: validateField(data, “phoneNumber”, options); 这迫使我要么使用魔法字符串,要么用该字符串声明一个常量。 我很确定没有办法用库存Java语言解决这个问题,但是有某种(生产级)预编译器或替代编译器可以提供解决方法吗? (类似于AspectJ如何扩展Java语言)做以下事情会很好: public Result validateField(Object data, Method method, ValidationOptions options) { … } 并称之为: validateField(data, Person.phoneNumber.getter, options);

是否可以使用Commons Bean Utils自动实例化嵌套属性?

我正在使用Apache Commons Bean Utils的PropertyUtils.setProperty(object,name,value)方法: 给这些课程: public class A { B b; } public class B { C c; } public class C { } 和这个: A a = new A(); C c = new C(); PropertyUtils.setProperty(a, “bc”, c); //exception 如果我尝试得到: org.apache.commons.beanutils.NestedNullException:bean类’class A ‘ 上’bc’的空属性值 是否有可能告诉PropertyUtils,如果嵌套属性具有空值,尝试在尝试深入之前实例化它(默认构造函数)? 还有其他方法吗? 谢谢

如何使用Object 数组调用MethodHandle.invokeExact()?

Java的MethodHandle.invokeExact(Object … args)采用可变长度的参数列表。 但是当我尝试传递一个Object []数组而不是一个列表时,我收到一个错误。 见下文: private void doIt() throws Throwable { Method meth = Foo.class.getDeclaredMethods()[0]; MethodHandles.Lookup lookup = MethodHandles.lookup(); MethodHandle mh = lookup.unreflect(meth); Foo foo = new Foo(); String myStr = “aaa”; Integer myInt = new Integer(10); Object [] myArray = {foo, myStr, myInt}; mh.invokeExact(foo, myStr, myInt); // prints “Called aaa 10” mh.invokeExact(myArray); // […]

在Java中转换为具体类和调用方法

假设我们有一个名为A的基类和一些子类( B , C , D等)。 大多数子类都有方法do()但基类没有。 AA类提供了一个名为getObject()的方法,它将创建一个B或C或D等的对象,但是将该对象作为类型A返回。 如果此方法可用,如何将返回的对象强制转换为具体类型并调用其do()方法? 编辑: 我不允许更改类A ,子类或AA ,因为我使用一个封闭的源API ..是的,它确实有一些设计问题,你可以看到。

如何匿名实例化存储在Java中的Class对象中的抽象类?

如果你有一个抽象类,你可以通过派生一个具体的匿名类来实例化它。 这是一个例子: abstract class A { abstract void hello (); } A say = new A () { void hello () { System.out.println (“hello”); } } say.hello(); // -> hello 如果类存储在Class对象中,如何做同样的事情? 这是一个例子: // -*- compile-command: “javac anon.java && java anon”; -*- class anon { anon () throws Exception {} abstract class AbstractClass { AbstractClass () […]

无法使用getDeclaredFields()来检索Scala类的字段

我正在尝试使用Scala的Java库(JOhm)并注意到当lib尝试使用类似于model.getClass().getDeclaredFields()东西读取我的Scala类的字段时,它会失败。 然后我决定尝试使用Scala解释器中的简单示例: scala> import java.lang.reflect.Field; import java.lang.reflect.Field scala> class myClass(attribute1: String, attribute2: String, attribute3: String) defined class myClass scala> val myInstance = new myClass(“value1”, “value2”, “value3”) myInstance: myClass = myClass@7055c39a scala> myInstance.getClass().getDeclaredFields() res0: Array[java.lang.reflect.Field] = Array() 实际上,我们根本没有任何领域。 现在,如果我尝试这样做: scala> class myClass2(attribute1: String, attribute2: String, attribute3: String) { override def toString = this.attribute1 } defined class […]

如何生成字节码并保存到.class文件?

我有以下奇怪的要求。 我给了: 一些方法名称的列表。 上述方法的名称和参数类型。 上述方法的function。 具体如下:对于每个参数,该方法使用toString将其转换为字符串并获取字符串数组。 对于该数组,该方法应用函数foo 。 函数foo将String []类型作为输入,并输出String 。 这些方法返回foo返回的内容。 foo的代码在Java对象中给出,并作为黑盒子进行访问。 1.和2.中的信息可以是文本或XML文件。 为此,我们可以认为它以我们选择的任何方式在Java对象中可用。 任务是创建一个实现这些方法的.class文件(即字节码),并且可以在JVM上运行。 我认为这个汇编程序库是一种方法。 有人能建议一个更简单的方法吗 [编辑:]我可以想到另一种方式:首先生成.java文件,然后编译它以获取.class文件。 [上下文:]我必须为数百种方法执行此操作。 我想要快捷方式,这样我就可以自动完成工作,而不是手动编写代码。