Tag: reflection

从版本2.11开始,scalareflectionfunction(特别是wrt注释)的(当前)状态是什么?

scala似乎是JVM世界的一个很好的补充。 它让我想起了嵌套在JVM世界中的C ++,C#和Swift的奇怪混合体。 但是,由于缺少或过时的文档,许多scala的function可能无法访问。 就其reflection能力而言,这似乎尤其如此。 例如,我正在评估是否可以使用scala注释在运行时或编译时扩充scala类。 我使用的是最新的scala版本2.11。 作为一个激励性的例子,让我说我创建一个case class SimpleAnnotation() extends StaticAnnotation 。 我想在运行时找到带有该注释的所有case class 。 这可能是注释最典型和最简单的用例。 在C#和Java中,在运行时确定给定的类是否被注释是相对简单的。 这是一个规范的用例,带有规范的答案。 然而,在scala中,我不清楚我应该做些什么来实现这种行为,甚至是否可能。 特别是,在scala注释和reflection上扫描一些以前的材料后,我想知道: 这可能吗? 这只能在运行时或complile时间吗? 这只能在scala版本2.10之前或之后实现吗? 这只能在scala类上使用Java注释吗? 为什么getClass[AnnotatedClass].getAnnotations返回如此看似乱码的信息? 为什么宏和reflection似乎在scala中混淆了? 任何指导都表示赞赏……我确信我不是唯一一个感到困惑的人。

引起:java.lang.ClassCastException:java.lang.Class无法强制转换为java.lang.reflect.ParameterizedType

我是Java Reflection的新手。 我检查了很多论坛,但我还没有找到合适的解决方案。 错误: Caused by: java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType 当我试图从db获取对象时: new Unit().getBy(3L); 方法声明 @MappedSuperclass public abstract class Generic { @Transient public Class entityClass; Generic() { entityClass = ((Class) ((Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0])); } @Id @GeneratedValue(strategy = GenerationType.TABLE) public Long id; public T getBy(Long id) { return JPA.em().find(entityClass, id); } 二级扩展 @MappedSuperclass public […]

反映方法范围变量的Java

使用reflection,您可以获得与课程相关的所有内容。 你可以获得所有声明的方法,字段和类(甚至可能更多),但我找不到一种方法来反映一个方法,所以我可以找出该方法可能使用的类。 基本上我想找出给定类具有的其他类的所有依赖项。 示例:给出以下代码: import com.yada.yada.yada.SomeClass public class MyClass { public MyClass { new SomeClass(); } } 我如何才能发现MyClass在其构造函数中使用SomeClass? 我试图想办法在类文件中定义所有导入语句,但我也找不到任何方法。 但是,假设有一种方法可以以某种方式挖掘类文件中定义的所有import语句,那么如何找到在同一个包中定义的类,这些类不需要import语句? 编辑: 场景:目标是将此类(MyClass)的字节码发送到另一个进程。 然后,这个其他进程接受字节码并使用类加载器加载类(MyClass),依此类推。 问题是,当我尝试在另一个进程中创建并运行MyClass的实例时,它会失败,因为它无法找到SomeClass的定义。 如果SomeClass是MyClass的成员,那么这不会是一个问题,但由于对它的唯一引用存在于一个方法中,所以没有办法通过reflection来实现它?

Javareflection:获取正确类型的参数化通用超类方法

我使用reflection来发现类及其超类的方法,以及方法参数和返回值的类型。 这大部分都有效,但我遇到了一些特定的通用案例。 假设我有一个基类: package net.redpoint.scratch; public class Base { public E getE() { return null; } } 还有一个子类: package net.redpoint.scratch; public class Derived extends Base {} 使用reflection我可以遍历Derived的方法并获取arg和返回类型(代码省略,但它工作正常)。 但是,我也想知道inheritance的方法。 使用下面的代码,我可以非常非常接近。 但是获得getE()的正确返回类型是我的选择。 我可以得到generics类型“E”但不是实际类型“java.lang.String”: package net.redpoint.scratch; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.lang.reflect.TypeVariable; public class Scratch { public static void main(String[] args) throws Exception { Class clazz […]

获取给定类的数组Class

给定一个描述A Class ,是否有可能获得与A[]类匹配的Class ? Class clazz = A.class; Class arrayclazz = clazz.toArray(); // ?? assert arrayclazz.equals(A[].class);

在前一次reflection之后,设置静态最终字段的Javareflection失败

在Java中,事实certificate,字段访问器被缓存,并且使用访问器具有副作用。 例如: class A { private static final int FOO = 5; } Field f = A.class.getDeclaredField(“FOO”); f.setAccessible(true); f.getInt(null); // succeeds Field mf = Field.class.getDeclaredField(“modifiers” ); mf.setAccessible(true); f = A.class.getDeclaredField(“FOO”); f.setAccessible(true); mf.setInt(f, f.getModifiers() & ~Modifier.FINAL); f.setInt(null, 6); // fails 而 class A { private static final int FOO = 5; } Field mf = Field.class.getDeclaredField(“modifiers” […]

从Java程序获取局部变量的名称和类型

这是我正在尝试的代码: JavaCompiler compilerA = ToolProvider.getSystemJavaCompiler(); int resultA = compilerA.run(null,null,null,”/Users/a/Documents/Java/a.java”); System.out.println(“Compile result code = ” + resultA); File fileA = new File(“/Users/a/Documents/Java/a.class”); JavaCompiler compilerB = ToolProvider.getSystemJavaCompiler(); int resultB = compilerB.run(null,null,null,”/Users/a/Documents/Java/b.java”); System.out.println(“Compile result code = ” + resultB); File fileB = new File(“/Users/a/Documents/Java/b.class”); 这里我编译一个Java类,然后使用reflection来获取所有函数名,参数和返回类型。 但是,我不知道如何获取函数的局部变量的名称和返回类型。 我尝试查找字节码大纲,但它说它不适用于netbeans。 请帮帮我。

可以在Java中序列化Method对象吗?

我尝试序列化一个Method对象时收到此错误。 java.io.NotSerializableException: java.lang.reflect.Method 任何的想法?

Javareflection:查找子类的字段

我有一个类层次结构,如下所示:(=>表示“是”的子类“) anonymous instance class => abstract class => generic abstract class 或者更简洁: C => B => A 执行时,“C”调用“A”方法之一。 在“A”中的该方法中,我想使用reflection来查找在“B”类中定义的对象的受保护字段。 (所以这些是“C”和“B”可以看到的字段,但不是“A”。) 我如何使用Javareflection做到这一点? 如果我在A&B或B&C之间添加一些东西,我怎么能面向未来呢?

在Java中,我可以从Class对象创建匿名子类的实例吗?

我有一个工厂方法,可以创建在unit testing中使用的对象。 这些对象都派生自相同的基类: public static T modMake(Class clazz) { try { return clazz.newInstance(); } catch (InstantiationException e) { // Should never happen throw new AssertionError(e); } catch (IllegalAccessException e) { // Should never happen throw new AssertionError(e); } } 现在我想从该基类覆盖一个getter方法,但仅用于测试。 我通常会使用匿名类来做到这一点,例如( Node是BaseEntity的子字节之一): public static Node nodMake() { return new Node() { @Override public long ixGet() […]