从如何使用堆栈跟踪或反射找到方法的调用者? (因为我没有足够的声誉在那里发表评论)
由于sun.reflect.Reflection.getCallerClass已在jdk8中删除,有什么可以替代?
如何使用sun.misc.SharedSecrets
JavaLangAccess access = SharedSecrets.getJavaLangAccess();
Throwable throwable = new Throwable();
int depth = access.getStackTraceDepth(throwable);
StackTraceElement frame = access.getStackTraceElement(throwable, depth);
Run Code Online (Sandbox Code Playgroud) 基本上我在方法中有一个日志语句.每当调用该方法时,我都希望轻松调用该方法的名称,并将其附加到logging语句中.这样做是为了最小化我的应用程序中的硬编码行数.这可以便宜吗?
当您在Android项目中导入第三方API(数据包依赖注入,生成的库,源代码等)时,您会认为它们的行为与广告一样.大多数时候代码不是开源的,它是混淆的或只是编译.
有没有办法控制此API对重要系统资源(如网络,联系人,视频和音频,位置)的访问?
最好的方法是为proxy他们提供系统资源.这将带来以下好处:
我未能找到如何实现这样的解决方案,因为用户定义的活动和服务无法控制第三方API的服务,甚至无法阻止它们直接调用任何Android公共接口.
该解决方案不应要求root访问权限,因为您不希望将此控件置于您自己的应用程序的边界之外.
这个问题的内容与几个问题相关联,这些问题解决了这个广泛问题的特殊性(内容提供者的日志数据,网络请求 - 让我在研究答案的同时考虑这个问题)
注意:简短的答案是否定的,但是一个人可以有足够的创造性(可能会针对本机级别的黑客可能会解决此问题 - idk)
我们如何将任何受保护方法的访问限制为仅在任何包中的子类而不是同一包中的类.
如果任何不是子类且在同一个包中的类也必须抛出类似"受保护的方法"的异常.
编辑:有没有办法检查调用类名实例,然后我们可以使用instanceof进行验证.
简短版本:我需要在Java中找到一种方法来定位Method调用堆栈中的前一个(注意方法中的大写'M' - 我需要实际的java.lang.reflect.Method对象).
背景:我正在研究Google Guava Preconditions.checkNotNull(...)概念的扩展,它允许程序员同时检查所有参数是否为null,并根据调用方法的参数名称构造NPE.例如:
public class MyClass
{
public void myMethod(Object arg1, Integer arg2, String arg3)
{
MyPreconditions.checkAllNotNull(arg1, arg2, arg3);
}
}
Run Code Online (Sandbox Code Playgroud)
因此,如果第一个参数为null,那么NPE可能会读取 arg1 cannot be null (MyClass:myMethod(Object, Integer, String)
我已经解决了如何获得调用Class,我可以通过Spring LocalVariableTableParameterNameDiscoverer(或通过Paranamer库)得到参数名称Method.我无法弄清楚的唯一部分是如何获得Method自己.
我知道您可以使用堆栈跟踪来获取方法名称,但如果重写该方法,则无效.有没有办法(即使是内部的com.sun类)来获得实际的堆栈?或者,我可以获取调用方法的行号,那么有没有办法找到Method从Class对象中检索的a的行号?
我试图在Scala应用程序的函数内获取调用者类和方法名称.我目前正在使用堆栈跟踪,但性能已降低.我正在做类似的事情
stackTrace(CodeDepth).getClassName
stackTrace(CodeDepth).getMethodName
Run Code Online (Sandbox Code Playgroud)
我发现Java反射更快,但我只能得到类名
sun.reflect.Reflection.getCallerClass(CodeDepth).getName()
Run Code Online (Sandbox Code Playgroud)
有没有办法通过反射获取方法名称(和可选的行号)?也许使用Scala的反思?
谢谢
让我们说我有一个方法 classA.methodA()及其调用classB.methodB().现在,在里面classB.methodB(),有没有办法知道它被调用classA(没有传递任何明确的信息).我知道Java Runtime中有这个信息.我的问题是如何获取被调用方法的类名?
使它更明显
ClassA{
methodA(){
ClassB b = new ClassB();
b.methodB();
}
}
ClassB{
methodB(){
// Code to find that its being called by ClassA
}
}
Run Code Online (Sandbox Code Playgroud) 假设我有一个类如下所示的方法
public class Parent {
public boolean isValidURL() {
System.out.println("print the name of the caller method and the method's arguements here");
//pls ignore the return true below. just an eg.
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我有另一个方法调用父类中的isValidURL
public class Child {
Parent parent = new Parent();
public void verifyURL(String url) {
parent.isValidURL();
}
}
Run Code Online (Sandbox Code Playgroud)
现在在Parent类中,该方法isValidURL()应该打印调用方法verifyURL()及其参数.
没有反思可能吗?是否有需要遵循的设计模式?
编辑:我想这样做,因为我想在记录器上实现这个想法.基本上,还有许多其他方法,例如verifyURL()接受不同参数的方法.当调用`Child'类中的任何方法时,我想有一个通用记录器在控制台上打印它
我只是好奇.我有时会请求该功能,但后来我用更多的代码解决了它.(调用类在调用方法时说出了它的名字)
是的,通过使用异常获取类名是一个合理的解决方案,但我正在寻找更优雅的东西.
String className = new Exception().getStackTrace()[1].getClassName();
Run Code Online (Sandbox Code Playgroud)
这将主要用于日志记录目的,并确保我的缓存关键字是特定于组件/调用者类的.