草庐IT

Reflection

全部标签

java - Java的field.setAccessible(true)在什么情况下会失效?

我有这样一种情况,用户的代码在反射访问的字段上抛出IllegalAccessException。在访问该字段之前,将调用setAccessible(true)。所以,在我看来,这种方法正在默默地失败。在什么情况下会发生这种情况?这可能与安全经理有关吗?这是导致异常的代码片段:privatestaticFieldlevelField;publicintgetLevel(){try{if(levelField==null){levelField=MessageInfo.class.getDeclaredField("level");levelField.setAccessible(true

Java.lang.reflect.Proxy 从调用返回另一个代理导致赋值时出现 ClassCastException

所以我在玩geotools,我想我应该代理他们的一个数据访问类,并跟踪它是如何在他们的代码中使用的。我编写了一个动态代理,并在其中包装了一个FeatureSource(接口(interface)),然后一切顺利。然后我还想看看featureSource返回的一些传递对象,因为FeatureSource所做的主要事情是返回一个FeatureCollection(FeatureSource类似于sql数据源,featurecollection类似于sql语句)。在我的invocationhandler中,我只是将调用传递给底层对象,打印出目标类/方法/args和结果,但是对于返回Featu

java - 将代码插入方法 - Java

有没有办法自动将代码插入到方法中?我有以下带有getter和setter的典型字段,我想将指示的代码插入到记录字段是否被修改的setter方法中,以及插入指示的“isFirstNameModified”字段以跟踪字段是否被修改是否被修改。publicclassPerson{SetupdatedFields=newLinkedHashSet();StringfirstName;publicStringgetFirstName(){returnfirstName;}booleanisFirstNameChanged=false;//Thiscodeisinsertedlaterpublic

Java:来自字节码的新实例

ClassWritercw=newClassWriter(...);byte[]bytes=cw.toByteArray();我想从bytes数组创建新的类实例。我该怎么做呢?有可能吗? 最佳答案 ClassLoader.defineClass()引用:ClassLoader.defineClass(Stringname,byte[]b,intoff,intlen) 关于Java:来自字节码的新实例,我们在StackOverflow上找到一个类似的问题: ht

Java 将未知原始数组转换为对象数组

我一直在尝试创建自己的库来序列化和反序列化基本类型,从类到xml以及从xml到类实例,使用反射检查方法命名模式和方法返回类型。到目前为止,我已经能够对所有基本基元类型执行此操作,但我在序列化相同基元的数组时遇到了困难。例如,我调用类方法来获取基元数组:method.invoke(clazz,(Object[])null);此方法将仅返回原始数组int[]、double[]、float[]、char[]等,但我们不知道它会是哪一个。我试过使用通用的,例如Tt=(T)method.invoke(clazz,(Object[])null);T[]t=(T[])method.invoke(cl

java - 检测方法是否在 Java 接口(interface)中声明

帮助我使这个方法更加可靠:/***Checkifthemethodisdeclaredintheinterface.*Assumesthemethodwasobtainedfromaconcreteclassthat*implementstheinterface,andreturntrueifthemethodoverrides*amethodfromtheinterface.*/publicstaticbooleanisDeclaredInInterface(Methodmethod,ClassinterfaceClass){for(MethodmethodInInterface:i

java - 我如何比较Java中的类型与反射

我有以下代码,现在我有类型,但我需要某种开关来知道类型是否为字符串,然后处理字符串。那么如何检查类型t是否为字符串类型?Typet=bean.getClass().getDeclaredField(fieldName).getType(); 最佳答案 您想进行名称检查还是基于对象的检查?由于Class实现了Type,您实际上可以直接对String.class执行equals例如:if(t.equals(String.class))但是,如果您想根据名称进行检查,则首先检查t是否是Class的实例,然后将其转换为Class,获取完整的

用于测试私有(private)方法的 Java 工具?

对于测试私有(private)方法的意义,众说纷纭,如here和here.我个人认为是有道理的,问题是如何正确地去做。在C++中,您可以使用#definehack或者使测试类成为friend,在C#中有InternalsVisibleToAttribute,但在Java中我们要么必须使用reflection或使它们“对测试可见”和annotatethemassuch为了明确意图。两者的缺点应该很明显。我认为应该有更好的东西。开始于publicclassSomething{privateintinternalSecret(){return43;}}如果能够像这样在测试代码中调用私有(pr

java - 通过反射向类添加新方法

这个问题在这里已经有了答案:CanaJavaclassaddamethodtoitselfatruntime?(11个答案)关闭9年前。Java中是否可以通过反射向类中添加方法??publicclassBaseDomain{publicBaseDomain(){Field[]fields=this.getClass().getDeclaredFields();for(inti=0;i

java - ByteBuddy 代理接口(interface)

我正在尝试将Cglib代理转换为ByteBuddy。Cglib有net.sf.cglib.proxy.Proxy拦截所有方法调用的接口(interface)。我查看了ByteBuddy的文档,但找不到这样的示例。如果我用ByteBuddy实例化的每个对象都没有这样的接口(interface),我就会一次又一次地重复同样的事情。使用ByteBuddy有更好的方法吗?这是我的示例代码片段:服务:publicclassMyService{publicvoidsayFoo(){System.out.println("foo");}publicvoidsayBar(){System.out.pr