gpt4 book ai didi

java - 查找并运行私有(private)注释方法的最简单方法是什么?

转载 作者:行者123 更新时间:2023-11-30 07:06:36 24 4
gpt4 key购买 nike

以下示例仅在 MyClass#myMethod() 为公共(public)时运行。如果它是私有(private)的,它不会运行它。

即使是私有(private)的,如何运行?

import org.apache.commons.lang3.reflect.MethodUtils;

import javax.annotation.PostConstruct;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;

import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
* Created by dims on 13.10.2016.
*/
public class CallPrivateMethodTest {

@Retention(RUNTIME)
@Target(METHOD)
public @interface MyAnnotation {
}

public static class MyClass {

@MyAnnotation
private void myMethod() {
System.out.println("myMethod() ran");
}
}

public static void main(String[] args) {

MyClass myObject = new MyClass();

List<Method> methods = MethodUtils.getMethodsListWithAnnotation(myObject.getClass(), MyAnnotation.class);


for(int i=0; i<methods.size(); ++i) {
try {
methods.get(i).invoke(myObject);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
}

最佳答案

您必须在您的方法上调用setAccessible(true)

参见the Javadoc of AccessibleObject ,它又是 Method 的父类(super class)型。

在您的示例中:

methods.get(i).setAccessible(true);
methods.get(i).invoke(myObject);
<小时/>

编辑:正如 GhostCat 在他的回答中指出的那样,并非所有反射调用都返回私有(private)方法。 It seems that MethodUtils#getMethodsListWithAnnotation事实上并没有返回它们。

要解决这个问题,您必须自己获取这些方法:

MyClass myObject = new MyClass ();

Method[] allMethods = myObject.getClass ().getDeclaredMethods ();
List<Method> annotatedMethods = Arrays.stream (allMethods)
.filter (m -> m.getAnnotation (MyAnnotation.class) != null)
.collect (Collectors.toList ());

for (Method method: annotatedMethods) {
try {
method.setAccessible (true);
method.invoke (myObject);
} catch (IllegalAccessException e) {
e.printStackTrace ();
} catch (InvocationTargetException e) {
e.printStackTrace ();
}
}

关于java - 查找并运行私有(private)注释方法的最简单方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40021962/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com