Tag: reflection

使用reflection从抽象基类访问构造函数

我正在玩Java的Reflection。 我有一个带有构造函数的抽象类Base 。 abstract class Base { public Base( String foo ) { // do some magic } } 我还有一些扩展Base类。 它们没有太多逻辑。 我想用Base的构造函数实例化它们,而不必在这些派生类中编写一些代理构造函数。 当然,我想用Reflection实例化那些派生类。 说: Class cls = SomeDerivedClass.class; Constructor constr; constr = cls.getConstructor( new Class[] { String.class } ); // will return null Class clsBase = Base.class; constr = clsBase.getConstructor( new Class[] { String.class } […]

如何从Java 8中的getAnnotatedParameterTypes()获取generics类型信息?

似乎getAnnotatedParameterTypes()返回一个包含原始类型而不是generics类型的AnnotatedType数组。 例如: public void genericMethod(T t) { } @Test public void testAnnotatedTypes() throws ReflectiveOperationException { Method method = getClass().getMethod(“genericMethod”, Object.class); Type type = method.getGenericParameterTypes()[0]; assertTrue(type instanceof TypeVariable); AnnotatedType annotatedType = method.getAnnotatedParameterTypes()[0]; // This fails; annotatedType implements only AnnotatedType assertTrue(annotatedType instanceof AnnotatedTypeVariable); // This fails too; type is a TypeVariable while annotatedType.getType() is // Object.class assertEquals(type, […]

Java中的通用方法参数的getClass()

以下Java方法无法编译: void foo(T t) { Class klass = t.getClass(); } 收到的错误是:类型不匹配:无法转换为Class Class为Class Class 有人可以解释为什么Class Class无效,但Class Class ? Javadoc说: 实际的结果类型是Class Class where | X | 是擦除调用getClass的表达式的静态类型。 例如,此代码片段中不需要强制转换: Number n = 0; Class c = n.getClass();

Javareflection:在自定义AbstractProcessor中查找方法用法

我是反思的新手。 有没有办法检测调用特定方法的位置? 例如: public class MyClass { public static void method(){ //DO SOMETHING } } public class Test { public test(){ MyClass.method(); } } public class MyProcessor extends AbstractProcessor { public boolean process(Set annotations, RoundEnvironment roundEnv) { Method method = MyClass.class.getDeclaredMethod(“method”); Class classWhereMethodIsInvoked = obtainClassWhereMethodIsInvoked(method); } public Class obtainClassWhereMethodIsInvoked(Method method) { //here I want to […]

如何在运行时在JUnit 4中获取测试用例名称?

我想在执行JUnit测试时做一些日志记录。 在JUnit 3.x中,无论实例化测试用例如何,总是很容易获得当前运行的测试用例的名称: public void testFoo() throws Exception() { String testName = this.getName(); // […] do some stuff } 在JUnit 4中,事情似乎并不那么容易。 有谁知道解决这个问题? 是否有任何选项可以反映到当前的Runner实例中?

Java:获取当前正在执行的Method对应的对象

将当前正在执行的方法作为Method对象的最优雅方法是什么? 我的第一个显而易见的方法是在helper类中使用静态方法,它将加载当前线程堆栈,获取正确的堆栈跟踪元素,并根据其信息构造Method元素。 是否有更优雅的方式来实现这一目标?

多个静态变量实例

我正在尝试使用不同的类加载器来加载特定的类,并查看该类中的静态变量是否可以具有不同的实例。 基本上,我正在尝试编写Stephen C在此答案中提到的代码。 这是我的课程: CustomClassLoader.java class CustomClassLoader extends ClassLoader { public Class loadClass(String classname) throws ClassNotFoundException { return super.loadClass(classname, true); } } Test.java(包含驱动程序) class Test { public static void main(String[] args) throws Exception { CustomClassLoader c1 = new CustomClassLoader(); CustomClassLoader c2 = new CustomClassLoader(); Class m1, m2; m1 = c1.loadClass(“A”); m2 = c2.loadClass(“A”); m1.getField(“b”).set(null, 10); […]

获取类的所有方法的新方法是什么,包括Java 8的inheritance默认方法?

我想获取类的所有方法,包括public,protected,package和private方法,以及包括inheritance的方法。 记得: Class.getDeclaredMethods()获取public,protected,package和private方法, 但不包括inheritance的方法。 Class.getMethods获取inheritance的方法, 但只获取公共方法。 在Java 8之前,我们可以做一些事情: Collection found = new ArrayList(); while (clazz != null) { for (Method m1 : clazz.getDeclaredMethods()) { boolean overridden = false; for (Method m2 : found) { if (m2.getName().equals(m1.getName()) && Arrays.deepEquals(m1.getParameterTypes(), m2 .getParameterTypes())) { overridden = true; break; } } if (!overridden) found.add(m1); } clazz = clazz.getSuperclass(); } […]

使用Class.forName()初始化一个类,该类具有一个带参数的构造函数

我正在实例化这样一个类。 myObj = (myObj) Class.forName(“fully qualified class name here”).newInstance(); 我怀疑的是,如果我们有一个构造函数,它接受参数如何像上面那样实例化它。 谢谢, 纳伦德拉

在工厂模式中使用reflection

在工厂模式中使用Reflection是一个好习惯吗? public class MyObjectFactory{ private Party party; public Party getObject(String fullyqualifiedPath) { Class c = Class.forName(fullyqualifiedPath); party = (PersonalParty)c.newInstance(); return party; } } PersonalParty实现派对