使用java反射

使用java反射,java,reflection,Java,Reflection,我试图使用java反射从另一个类调用属于一个类的私有方法。这两个类都属于不同的包。代码示例如下所示。但是每次我运行getDeclaredMethod时,它都会返回,但没有任何方法异常。如何从类中调用getCacheKey方法 谢谢 甲级 B类 com.def中的类也被称为ticketlper吗?在这种情况下,您需要符合com.abc.ticketlper 编辑 您发布的代码中有几个编译错误。总是试着用一个简单的例子再现问题;在大多数情况下,你会看到你在这个过程中的错误。以下内容适合我。它是同一个

我试图使用java反射从另一个类调用属于一个类的私有方法。这两个类都属于不同的包。代码示例如下所示。但是每次我运行getDeclaredMethod时,它都会返回,但没有任何方法异常。如何从类中调用getCacheKey方法

谢谢

甲级 B类
com.def中的类也被称为ticketlper吗?在这种情况下,您需要符合
com.abc.ticketlper

编辑

您发布的代码中有几个编译错误。总是试着用一个简单的例子再现问题;在大多数情况下,你会看到你在这个过程中的错误。以下内容适合我。它是同一个包,但这不重要:

public class TicketHelperUser
{
    public static void main(String[] args) throws Exception
    {
    for (java.lang.reflect.Method m : TicketHelper.class.getDeclaredMethods())
    {
        System.out.println(m);
    }
    java.lang.reflect.Method method = TicketHelper.class.getDeclaredMethod("getCacheKey", String.class, Ticket.class);
    method.setAccessible(true);
    method.invoke(null, new Object[] {"", new Ticket()});
    }
}

public class TicketHelper
{
    static String getCacheKey(String ticketString, Ticket ticket) 
    {
    return "cacheKey";
    }

}

public class Ticket {}

不是解决方案,而是识别问题的测试:获取所有声明的方法并验证
getCacheKey
是否可见/存在:

Method[] methods = TicketHelper.class.getDeclaredMethods();
for (Method method:methods) {
  if (method.getName().equals("getCacheKey")) {
    System.out.println(method);  // <-- breakpoint and inspect the method object
  }
}
Method[]methods=TicketHelper.class.getDeclaredMethods();
用于(方法:方法){
if(method.getName().equals(“getCacheKey”)){
System.out.println(方法);//查看:


他们使用getMethod而不是getDeclaredMethod

这与
asp.net
JavaEE
有什么关系?好吧,这两种方法的区别是:1)
getDeclaredMethod
查找私有方法,而
getMethod
只查找公共方法(所以这里没有太大帮助),2)
getMethod
还将搜索在超类型中声明的方法。虽然这有它的用途,但在这里并不重要。非常确定这是正确的。
ticketlper.class
正在返回对
com.def.ticketlper
类对象的引用,该对象显然不包含
getCacheKey
方法。我可以列出使用这段代码的类的方法。你知道使用java反射的缺点吗?论坛帖子建议尽可能避免这种情况。如果可以避免的话,就不应该使用反射。反射会将错误检查推迟到运行时,并且会带来性能开销。如果必须使用,请获取引用对于
方法
对象的ce是最昂贵的,而不是
调用
调用;因此最好保持缓存。
public class TicketHelperUser
{
    public static void main(String[] args) throws Exception
    {
    for (java.lang.reflect.Method m : TicketHelper.class.getDeclaredMethods())
    {
        System.out.println(m);
    }
    java.lang.reflect.Method method = TicketHelper.class.getDeclaredMethod("getCacheKey", String.class, Ticket.class);
    method.setAccessible(true);
    method.invoke(null, new Object[] {"", new Ticket()});
    }
}

public class TicketHelper
{
    static String getCacheKey(String ticketString, Ticket ticket) 
    {
    return "cacheKey";
    }

}

public class Ticket {}
Method[] methods = TicketHelper.class.getDeclaredMethods();
for (Method method:methods) {
  if (method.getName().equals("getCacheKey")) {
    System.out.println(method);  // <-- breakpoint and inspect the method object
  }
}