Tag: reflection

如何测试reflection得到的Java字段的值是否为空?

我有 Field f = this.getClass().getFields()[0]; 我需要知道f的值是否为null 。 有许多方法,如getInt()和getDouble() ,但我没有找到像Object getData()或isNull() 。 有这样的方法吗?

有没有比javareflectionapi更好的获取对象的字段getter的方法,或者我在使用PropertyDescriptor的getReadMethod?

语境: 我正在使用从SOAP服务端点接收的数据以通用方式构建Excel文档。 我以List的forms接收数据,并根据调用的方法为我收到的每个Object提供模型(JavaBeans)。 所以我将工作表的第一行设置为对象字段(getDeclaredFields)的标题。 然后我继续用对象列表中的值逐行填充列。 问题: 我还没有找到一种可行的方法来获取对象的字段值。 我已经尝试使用带有javareflectionAPI的getter,使用类似这样的答案的https://stackoverflow.com/a/5503534/4807777 findGetterName,findGetter但是PropertyDescriptor的getName有时候是一个与字段名称不同的字母大小写,从class的getDeclaredFields。 假设我通过大写两个名称来克服这个问题,getReadMethod stil失败 – 似乎没有为使用is前缀的字段(即布尔字段)找到getter。 我不知道我是否在滥用它或者它是一个错误(调试getReadMethod似乎只能使用get前缀,即使它似乎处理boole的is前缀情况)。 考虑到这些字段在对象包之外是不可访问的,因此仅通过调用getter来实现。 有没有更好的方法来获取对象的字段getter或我错过了getter方法的东西? 更新:当JavaBean属性映射到XML元素时,Spring的BeanUtils似乎更适合用它获取属性getPropertyDescriptors比java Class的getDeclaredFields更好。 这修复了不同的字母情况。 但是,当不使用get前缀时,它不会发现它是readMethod。 编辑 – 显示一个getReadMethod没有找到带前缀的getter的例子,正如Laszlo Lugosi所要求的那样。 一个简单的类: class Test { private String assignmentType; private Boolean conserved; public String getAssignmentType() {return assignmentType;} public void setAssignmentType(String assignmentType) {this.assignmentType = assignmentType;} public Boolean isConserved() {return conserved;} public void setConserved(Boolean conserved) […]

使用reflection加载类,然后在运行时编辑变量

好吧,所以我有一个java文件正在加载另一个类,我希望java文件能够编辑和读取正在运行的类中的变量。 例如:我有一个按钮,按下它时设置一个变量(这是类文件)。 我希望加载此类的java文件能够看到变量的新值读取它,设置它并执行所需的任何操作。 我希望设置的新值显示在正在运行的java类中。 这是我到目前为止所尝试的,但是当我尝试编辑像获取baseX这样的值时,它不会出现在正在运行的类上。 此外,当我在运行类上执行操作时,baseX值应该更改,但是当我更改它们时,东西不会打印到屏幕上。 就好像reflection无法在运行时读取内容。 那是什么? Class c = Class.forName(“Client”); for (Method m : c.getMethods()) { if (m.getName().contentEquals(“main”)) { Object[] passedArgs = { args }; m.invoke(null, passedArgs); } } Object instance = c.newInstance(); Field baseX = c.getField(“baseX”); Field loggedIn = c.getField(“loggedIn”); boolean gotValues = false; while(!gotValues) { boolean loggedin = loggedIn.getBoolean(instance); if(loggedin) { […]

如何删除此错误? java.lang.reflect.InvocationTargetException

我添加了所有必需的权限 PackageManager packageManager = context.getPackageManager(); Class [] c = new Class[2]; c[0] = String.class; c[1] = IPackageDataObserver.class; try { Object cleardata = packageManager.getClass().getMethod(“clearApplicationUserData”, c); Object[] o = new Object[2]; o[0] = String.valueOf(“my.app.withdata”); o[1] = new ClearApplicationDataObserver(); ((Method)cleardata).invoke(packageManager, o); } catch(Exception e) {e.printStackTrace(); } 02-02 16:08:26.629: W/System.err(709): java.lang.reflect.InvocationTargetException 02-02 16:08:26.678: W/System.err(709): at java.lang.reflect.Method.invokeNative(Native Method) 02-02 16:08:26.738: […]

在Android中,如何使用Javareflection调用sun.misc.Unsafe方法?

虽然有类似的问题(如A , B和C ),但他们的答案并没有解决我的问题。 我使用Android Studio 1.5.1定位Android API 18(在Android KitKat 4.4之前,所以我正在处理Dalvik,而不是ART运行时)。 我的问题是: (1)当我使用下面的代码时,我可以打印Android中可用的所有sun.misc.Unsafe方法的列表,所以我想我可以使用reflection访问它们,但我不知道如何使用reflection调用它们。 (2)如果(1)是可能的,如何在Android中通过reflection使用sun.misc.Unsafe方法找到magicNumber(在下面的代码中)地址? (3)如果(1)是可能的但是(2)是不可能的,如何在任何本地存储器地址中放入一个整数(比如int test = 123)并使用Android中的sun.misc.Unsafe方法打印其存储器地址reflection? String ClassName = “sun.misc.Unsafe”; int magicNumber = 0x23420023 ; try { Class classToInvestigate = Class.forName(ClassName); Constructor[] aClassConstructors = classToInvestigate.getDeclaredConstructors(); for(Constructor c : aClassConstructors){ System.out.println(“********************* constructor=”+c); } Method[] aClassMethods = classToInvestigate.getDeclaredMethods(); for(Method m : aClassMethods){ System.out.println(“********************* method=”+m); } […]

将libgdx项目导出为HTML – 您是否忘记inheritance所需的模块?

我尝试用HTML导出我的libgdx游戏。 我已经在Android和桌面上导出它,它运行良好。 但是当我执行./gradlew html:dist ,我有很多像这样的错误: [ERROR] Line 75: No source code is available for type net.spookygames.gdx.gameservices.playtomic.PlaytomicServicesHandler; did you forget to inherit a required module? net.spookygames.gdx.gameservices是一个包在核心文件夹中的主包旁边: 我在文档和另一个问题上看到我需要使用reflection,将此行放在html文件夹中的GdxDefinition.gwt.xml中: 但它没有改变任何东西..我还需要做别的吗? 谢谢 编辑:这是堆栈跟踪: org.gradle.api.tasks.TaskExecutionException: Execution failed for task ‘:html:compileGwt’. at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46) at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35) at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:66) at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58) at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:52) at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52) at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53) at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43) at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:203) […]

无法测试返回customException的类

在试验JUnit时,我试图测试一个简单的私有方法,如下所示,此方法接收一个String并确保其中不包含单词“Dummy”。 我知道,可以将测试放在与类相同的包中,并将方法的访问修饰符更改为包,但我想使用reflection来学习。 private void validateString(String myString) throws CustomException { if (myString.toLowerCase().matches(“.*dummy.*”)) throw new CustomException(“String has the invalid word!”); } 我试图通过reflection访问私有方法,但测试失败! 它显示以下exception: java.lang.AssertionError:Expected test to throw (an instance of com.myproject.exception.CustomException and exception with message a string containing “String has the invalid word!”) 基于这个问题的答案,我也在捕捉InvocationTargetException 。 JUnit的 @Rule public ExpectedException thrown = ExpectedException.none(); @Test public void shouldThrowExceptionForInvalidString() { […]

如何创建在运行时知道的类的实例?

我们如何使用参数化构造函数创建类的对象,并且类的名称将在运行时作为命令行参数提供给我们。 这条线意味着什么 new Class [] {String.class} 和String.class有什么区别?

使用javareflectionAPI访问私有对象

我可以使用javareflection访问并获取对象的值 是获取–getLong,getInt的方法,但我找不到getObject()

如何检查Java类是否包含JUnit4测试?

我有一个Java类。 如何检查类是否包含JUnit4测试的方法? 我是否必须使用reflection对所有方法进行迭代,或者JUnit4是否提供此类检查? 编辑: 由于评论不能包含代码,我根据答案放置了我的代码: private static boolean containsUnitTests(Class clazz) { List methods= new TestClass(clazz).getAnnotatedMethods(Test.class); for (FrameworkMethod eachTestMethod : methods) { List errors = new ArrayList(); eachTestMethod.validatePublicVoidNoArg(false, errors); if (errors.isEmpty()) { return true; } else { throw ExceptionUtils.toUncheked(errors.get(0)); } } return false; }