Tag: reflection

如何从动态代理显式调用默认方法?

由于Java 8接口可以有默认方法。 我知道如何从实现方法中显式调用该方法,即(请参阅在Java中显式调用默认方法 ) 但是,如何在代理上使用reflection显式调用默认方法? 例: interface ExampleMixin { String getText(); default void printInfo(){ System.out.println(getText()); } } class Example { public static void main(String… args) throws Exception { Object target = new Object(); Map<String, BiFunction> behavior = new HashMap(); ExampleMixin dynamic = (ExampleMixin) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),new Class[]{ExampleMixin.class}, (Object proxy, Method method, Object[] arguments) -> { //custom mixin […]

根据运行时属性对对象列表进行排序

我有一个VO的arraylist。 这些对象具有许多属性和相应的get / set方法。 我想基于我将在运行时获得的属性对此数组列表进行排序。 让我详细解释一下。 我的VO是这样的 public class Employee { String name; String id; private String getName() { return name; } private String getId() { return id; } } 我将在运行时获得一个字符串’sortType’,它可以是’id’或’name’。 我想根据字符串的值对列表进行排序。 我试图一起使用比较器和reflection,但没有运气。 可能是我没有正确使用它。我不想使用if循环并创建新的比较器类。 还有其他想法吗? try catch应该在新类中。 这是工作代码。 如果你想为比较器使用一个单独的类,请在@ Bohemian的评论中找到它。 String sortType = “name”; // determined at runtime Collections.sort(results, new Comparator() { public int compare(Employee […]

在运行时使用JDK编译器时内存泄漏

我试图在我的程序中添加一个javaeditor来在运行时扩展程序。 一切正常,除了广泛使用程序(我模拟1000-10000编译器执行)。 内存使用量上升和上升,看起来有内存泄漏。 在我的程序中,类被加载,构造函数被执行并且类被卸载(没有剩余的实例,并且当我将指针设置为null时,classLoader变得无效)。 我用JConsole分析了这个过程,当执行垃圾收集器时,类被卸载。 我在内存分析器中做了一个heapdum打开它,问题似乎在java.net.FactoryURLClassLoader里面(在com.sun.tools.javac.util.List对象中)。 由于(com.sun.tools.javac)是JDK的一部分,而不是JRE,而SystemToolClassLoader是一个FactoryURLClassLoader对象,我会在那里的某处找到泄漏。 当我第一次执行编译器时,SystemToolClassLoader中加载的类的数量从1上升到521,但之后保持不变。 所以我不知道泄漏在哪里,有没有办法重置SystemToolClassLoader? 我怎样才能更准确地找到泄漏点。 编辑:好的,我发现它也发生在一个非常简单的例子中。 所以它似乎是编译的一部分,我不需要加载类或实例化它: import java.io.File; import java.io.IOException; import java.util.Arrays; import javax.tools.JavaCompiler; import javax.tools.JavaFileObject; import javax.tools.StandardJavaFileManager; import javax.tools.ToolProvider; public class Example { public static void main(String[] args) { for (int i =0; i<10000;i++){ try { System.out.println(i); compile(); } catch (InstantiationException | IllegalAccessException | ClassNotFoundException | IOException e) […]

哪个类调用了我的静态方法?

假设我有一个带有静态方法的Java类,如下所示: A级 { static void foo() { //哪个class叫我? } } 并且进一步假设类A具有任意数量的子类: B级扩展A {} C类延伸A {} D级延伸A {} … 现在考虑以下方法调用: A.foo(); B.foo(); C.foo(); D.foo(); … 我的问题是,方法foo()如何告诉哪个类正在调用它?

是否有任何开源Javareflection实用程序或jar?

是否有任何开源实用程序或jar用于处理java中的reflection? 我正在动态地将方法传递给类,我想获取返回值。 例如: class Department { String name ; Employee[] employees; public void setName(String name) { this.name = name; } public String getName() { return name; } public Employee[] getEmployes() { return employees; } } 我想将所有员工打印到控制台输出,而是在运行时获取它,如下所示: Department dept = new Department(); // add employees.. getEmployeeNames(dept,”getEmployees.getAddress.getStreet”); // So the user says they want employee street, but […]

Java反思和重构的痛苦

Java Reflection提供了一种在运行时对Object进行内省的机制。 没有第二个想法,这是一个很棒的function,但它打破了所有重构惯例! 即使在现代IDE中也没有简单的方法( File Search除外)知道引用了哪个属性以及在哪里。 这使得Refactorings变得更加复杂(令人厌烦!)并且容易出错。 坦率地说,它不仅仅是Reflection API ; Hibernate mapping files (hbm.xml)和JSP files都将属性称为String,当您重构属性名称时,您必须手动更改所有这些位置。 更糟糕的是,Hibernate映射文件或JSP文件中的更改会导致运行时错误。 我很想知道其他程序员如何在Java中处理这个问题。 有一些工具吗? 我使用Eclipse / IBM RAD作为主要开发平台。 通常我们使用constant来定义属性并尽可能地使用它,但它并不总是可行的。 我也有兴趣其他语言如何处理这个!

如何检查当前方法的参数是否有注释并在Java中检索该参数值?

考虑以下代码: public example(String s, int i, @Foo Bar bar) { /* … */ } 我想检查方法是否有注释@Foo并获取参数或如果没有找到@Foo注释则抛出exception。 我目前的方法是首先获取当前方法,然后遍历参数注释: import java.lang.annotation.Annotation; import java.lang.reflect.Method; class Util { private Method getCurrentMethod() { try { final StackTraceElement[] stes = Thread.currentThread().getStackTrace(); final StackTraceElement ste = stes[stes.length – 1]; final String methodName = ste.getMethodName(); final String className = ste.getClassName(); final Class currentClass = […]

你如何获得带有reflection的List ?

我得到一个方法,并检查method.getParameterTypes()[0] ,这是一个java.util.List 。 但我想弄清楚包含类型是什么,例如,如果它是java.util.List我想弄清楚它应该包含字符串。 我该怎么做呢? 谢谢!

Java:运行时方法解析

我正在通过解释器进行一些动态的代码调用,我正在进入JLS第15.12节中讨论的方法解决的粘性丑陋区域。 选择方法的“简单”方法是,当您知道所有参数的确切类型时,您可以使用Class.getDeclaredMethod(String name, Class[] parameterTypes) 。 也许你必须检查方法可访问性和类的超类/超接口。 但这并不包括以下任何一种情况,所以它有点无用: 装箱/拆箱原语 亚型 可变参数 一个null参数(可以是任何类型,除非解释器另有说明;在编译时,任何歧义都会通过将null转换为类/接口来消除) 原始类型转换(不是Java的一部分,但在语言环境中是允许的 – 例如Rhino Javascript,其中所有数字都是浮点数,因此Java代码可能需要一个int但调用者传入的数字是int或者double ) (见下面的前三个快速示例) 所以现在我必须编写自己的方法解析库… 有没有任何着名的框架库来协助这个? package com.example.test.reflect; import java.lang.reflect.Method; public class MethodResolutionTest { public void compute(int i) { /* implementation… */ } public void compute(Long l) { /* implementation… */ } public void compute(Object obj) { /* implementation… */ } […]

带有类类型的JavareflectiongetDeclaredMethod()

我正在尝试理解Javareflection,并且在使用非整数setter方法时遇到了困难。 举个例子,我如何解决下面的“getDeclaredMethod()”调用? import java.lang.reflect.*; class Target { String value; public Target() { this.value = new String(“.”); } public void setValue(String value) { this.value = value; } public String getValue() { return this.value; } } class ReflectionTest { public static void main(String args[]) { try { Class myTarget = Class.forName(“Target”); Method myMethod; myMethod = myTarget.getDeclaredMethod(“getValue”); // […]