Tag: reflection

如何获取方法的行号?

是否可以使用reflection或其他魔法获取方法的行号? 如果方法在当前Stacktrace内,则可能。 使用Thread.currentThread().getStackTrace() ,可以获得StackTraceElement的行号。 但是如果我只获得了java.lang.reflect.Method对象,我该怎么办? 我发现这个,对于classes-> 如何从java.lang.Class对象获取源文件名/行号,但它对方法没有用。

获取数组类型的Class对象的最佳方法是什么?

获取类的类文字很容易: String.class 但是如何获取数组类型的类对象? 这有效,但它很难看,可能不是编译时常量: new byte[0].getClass() 我查看了JLS,但我发现的唯一一件事就是根据JLS定义我所谓的“类文字”不是“文字”。

如何获取对象构造函数的参数名称(reflection)?

说我以某种方式得到了另一个类的对象引用: Object myObj = anObject; 现在我可以得到这个对象的类: Class objClass = myObj.getClass(); 现在,我可以获得此类的所有构造函数: Constructor[] constructors = objClass.getConstructors(); 现在,我可以循环每个构造函数: if (constructors.length > 0) { for (int i = 0; i < constructors.length; i++) { System.out.println(constructors[i]); } } 这已经给了我构造函数的一个很好的总结,例如构造函数public Test(String paramName)显示为public Test(java.lang.String) 但是,我想获取参数的名称,而不是给我类类型。在这种情况下,“paramName”。 我该怎么办? 我尝试了以下但没有成功: if (constructors.length > 0) { for (int iCon = 0; iCon 0) { for […]

如何在Java中获取给定类的Array类?

我有一个包含某种类型的Class变量,我需要获取一个包含相应数组类的变量。 我能想到的最好的是: Class arrayOfFooClass = java.lang.reflect.Array.newInstance(fooClass, 0).getClass(); 有没有办法在不创建新实例的情况下执行此操作?

在Java中获取包装器类类型的简单方法

我有一段代码,我需要在方法中传递一个字段的类。 由于我的代码的机制,我只能处理引用对象而不是基元。 我想要一种简单的方法来确定Field的类型是否是原始的,并将其与适当的包装类交换。 所以在代码中我到目前为止所做的是这样的: Field f = getTheField(); // Dummy method that returns my Field Class c = f.getType(); if (c == int.class) { c = Integer.class; } else if (c == float.class) { c = Float.class; } // etc myMethod(c); 这工作正常,除了我需要显式检查所有原始类型并使用适当的包装类交换它们。 现在我知道没有那么多原始类型,简单地列出它们就不会有问题,但我想知道是否有更简单,更优雅的方式。

找出使用给定API的哪些类

在我的Java项目中,我想以编程方式找出使用给定API中的哪些类。 有没有一个好方法呢? 通过源代码解析或字节码解析可能吗? 因为reflection不会有任何用处,我担心。 为了简单起见:我的项目中没有任何通配符导入( import com.mycompany.api.*; ),没有完全限定的字段或变量定义( private com.mycompany.api.MyThingy thingy; )也没有任何Class.forName(…)构造。 鉴于这些限制,我认为它可以归结为解析import语句。 有没有一种首选的方法来做到这一点?

如何禁用Java安全管理器?

有没有办法完全禁用Java安全管理器? 我正在试验db4o的源代码。 它使用reflection来持久化对象,并且安全管理器似乎不允许reflection来读写私有或受保护的字段。 我的代码: public static void main(String[] args) throws IOException { System.out.println(“start”); new File( DB_FILE_NAME ).delete(); ObjectContainer container = Db4o.openFile( DB_FILE_NAME ); String ob = new String( “test” ); container.store( ob ); ObjectSet result = container.queryByExample( String.class ); System.out.println( “retrieved (” + result.size() + “):” ); while( result.hasNext() ) { System.out.println( result.next() ); } […]

如何使用varargs和reflection

简单的问题,如何使这段代码工作? public class T { public static void main(String[] args) throws Exception { new T().m(); } public // as mentioned by Bozho void foo(String… s) { System.err.println(s[0]); } void m() throws Exception { String[] a = new String[]{“hello”, “kitty”}; System.err.println(a.getClass()); Method m = getClass().getMethod(“foo”, a.getClass()); m.invoke(this, (Object[]) a); } } 输出: class [Ljava.lang.String; Exception in […]

禁用当前线程的Javareflection

我需要调用一些半可信赖的Java代码,并希望禁用在代码执行期间使用reflection的能力。 try{ // disable reflection somehow someObject.method(); } finally{ // enable reflection again } 可以使用SecurityManager来完成,如果是这样,怎么做? 澄清/上下文:这是关于限制可以从JavaScript / Rhino调用的包的另一个问题的后续行动。 接受的答案引用了关于如何做到这一点的博客条目,它需要两个步骤,第一个使用Rhino API(ClassShutter),第二个关闭reflection和Class.forName()。 我想我可以使用SecurityManager更干净地完成第二步(了解SecurityManager,正如已经指出的那样,它是一个复杂的野兽,一路走来)。 总而言之,我希望(从代码,而不是设置文件)关闭Class.forName()以及对整个reflection包的任何访问。

Java Reflection Beans Property API

是否有任何标准方法来访问Java Bean属性 class A { private String name; public void setName(String name){ this.name = name; } public String getName(){ return this.name; } } 所以我可以使用Reflection API访问这个java bean属性名,这样当我更改property的值时,当我设置并获取该属性的值时,会自动调用getName和setName的方法。