스레드 내부에서 메서드 호출

로피

링크 에서 Invoking Method에 대해 배우고 이제 사용하려고하지만 원하는 논리로 작동하도록 만들 수 없습니다. 단순히 Thread에서 메서드를 호출하고 싶습니다.

아래 코드를 사용했는데 작동합니다. 하지만 여기서 문제는 루프입니다. 루프는 클래스의 모든 메소드를 나열하고 특정 메소드가 존재하는지 확인한 다음 호출해야합니다.

Class myclass = Class.forName("com.package.MainActivity");
Method[] methods = myclass.getMethods();
for (int i = 0; i < methods.length; i++) {
    if (methods[i].getName().equals("methodName")) {
        Log.w(TAG, "Method Found!");
        methods[i].invoke("methodName", "string data", 0123, 123, "string data");
    }
}

아래 코드로 간단하게 만들고 싶지만 메서드를 찾을 수 없다는 메시지가 계속 표시됩니다. ERROR: java.lang.NoSuchMethodException: methodName []

Class c=Class.forName("com.package.MainActivity");
Method m=c.getMethod("methodName");
Object t = c.newInstance();
Object o= m.invoke(t,"string data", 0123, 123, "string data");

또한 아래 코드를 시도했지만 작동하지 않고 오류가 표시됩니다. Can't create handler inside thread that has not called Looper.prepare()

Object carObj = Class.forName("com.package.MainActivity").newInstance();
Method method = carObj.getClass().getMethod("methodName");
method.invoke(method, "string data", 0123, 123, "string data");

위의 모든 코드를 아래에서 수행하고 있습니다.

메소드가 호출되어야하는 메인 클래스

public class MainActivity extends AppCompatActivity {

    static MyHelper myHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btnStart = (Button)findViewById(R.id.btnStart);

        myHelper = new MyHelper(this);
        myHelper.StartThread();

    }

    /*The Method to Invoke*/
    public static void methodName(String data1, int var1, int var2, String data2){
        //some code here...
    }
}

내 기능 중 일부를 포함하여 Thread 시작을위한 도우미 클래스

public class MyHelper{
    private Context context;
    public MyHelper(Context context){
       this.context = context;
    }

    public static void StartThread(){
        TheThread theThread = new TheThread(context);
        Thread t = new Thread(theThread);
        t.start();
    }

    //Some code below
}

메소드가 호출되어야하는 스레드

public class TheThread implements Runnable{

    private Context context;

    public TheThread(Context context){
       this.context = context;
    }

    @Override
    public void run(){
        try{

            String className = context.getClass().getName(); //The Class Name including its package.

            //First Attempt
            /*Class myclass = Class.forName(className);
            Method[] methods = myclass.getMethods();
            for (int i = 0; i < methods.length; i++) {
                if (methods[i].getName().equals("methodName")) {
                    Log.w(TAG, "Method Found!");
                    methods[i].invoke("methodName", "string data", 0123, 123, "string data");
                }
            } */

            //Second Attempt
            /*Class c=Class.forName(className);
            Method m=c.getMethod("methodName");
            Object t = c.newInstance();
            Object o= m.invoke(t,"string data", 0123, 123, "string data");*/

            //Third attempt
            /*Object carObj = Class.forName(className).newInstance();
            Method method = carObj.getClass().getMethod("methodName");
            method.invoke(method, "string data", 0123, 123, "string data"); */

        }catch(Exception e){
            Log.e("Invoke Error","Unable to invoke method => " + e.toString());
        }
    }
}

나는 현재 재고가 있고 invoke 메소드에 대해 완전히 혼란 스럽습니다. 어떻게 해결할 수 있습니까? 특정 메서드를 호출하기 전에 확인하기 위해 클래스의 모든 메서드를 나열해야하므로 첫 번째 시도를 선호하지 않습니다.

디가 딤

두 번째 예제는 거의 Ok입니다. 단, 메소드에 어떤 매개 변수가 있는지 알려 주어야합니다.

Class c=Class.forName("com.package.MainActivity");
Method m=c.getMethod("methodName", String.class, int.class, int.class, String.class);
Object t = c.newInstance();
Object o= m.invoke(t,"string data", 0123, 123, "string data");

메소드 서명은 항상 methodName + 매개 변수 유형 목록으로 구성됩니다. 매개 변수 유형을 지정하지 않으면 인수가없는 메소드를 찾습니다. 이것이 두 번째 예제에서 NoSuchMethod 예외를 던지는 이유입니다.

참고로, 메서드가 정적 인 경우 (예제에서와 같이) 클래스 인스턴스에 신경 쓰지 마십시오. m.invoke 호출의 첫 번째 매개 변수로 널을 전달할 수 있습니다. Method javadoc : https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Method.html#invoke-java.lang.Object-java.lang.Object...-를 참조하십시오. .

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

* ngIf 내부에서 메서드 호출

분류에서Dev

스레드 내에서 순수 가상 메서드 호출

분류에서Dev

JavaScript에서 해당 메서드 내부의 메서드 호출

분류에서Dev

Java-메서드 내부에서 메서드 호출 계산

분류에서Dev

인터페이스 C #의 메서드 내부에서 메서드 호출

분류에서Dev

Python의 다른 클래스 내부에서 메서드 호출

분류에서Dev

다른 클래스 내부에서 메서드 호출

분류에서Dev

메인 스레드에서 메서드 호출-UnityEngine C #

분류에서Dev

tcl 스레드 내에서 proc 호출

분류에서Dev

$ routeProvider 내부의 AngularJS 호출 메서드

분류에서Dev

부모 메서드 호출

분류에서Dev

메서드에서 스레드를 호출하는 방법

분류에서Dev

완료시 다른 스레드에서 메서드 호출

분류에서Dev

새 스레드 C에서 메서드 호출

분류에서Dev

ndk의 다른 스레드에서 Java 메서드 호출

분류에서Dev

메서드에서 메서드 호출

분류에서Dev

자바에서 이미 시작된 스레드 내부에서 코드 호출

분류에서Dev

조각 내에서 메서드 호출

분류에서Dev

typescript에서 부모 메서드 호출

분류에서Dev

NavigationManager.LocationChanged 내부에서 비동기 메서드 호출

분류에서Dev

BroadcastReceiver에서 Activity 내부의 메서드 호출

분류에서Dev

개체 내부에서 메서드 호출

분류에서Dev

Swift : init 내부에서 자체 메서드 호출

분류에서Dev

Fragment 내부에서 Activity 메서드를 호출하는 방법

분류에서Dev

모델 내부에서 메서드 호출

분류에서Dev

Python 다른 메서드 내부에서 메서드를 호출하는 방법

분류에서Dev

메서드 내부에서 메서드를 다시 호출해도됩니까?

분류에서Dev

PHP : 동일한 클래스 내에서 내부 (Function) 메서드 호출

분류에서Dev

모든 병렬 클래스 스레드의 메서드 호출

Related 관련 기사

  1. 1

    * ngIf 내부에서 메서드 호출

  2. 2

    스레드 내에서 순수 가상 메서드 호출

  3. 3

    JavaScript에서 해당 메서드 내부의 메서드 호출

  4. 4

    Java-메서드 내부에서 메서드 호출 계산

  5. 5

    인터페이스 C #의 메서드 내부에서 메서드 호출

  6. 6

    Python의 다른 클래스 내부에서 메서드 호출

  7. 7

    다른 클래스 내부에서 메서드 호출

  8. 8

    메인 스레드에서 메서드 호출-UnityEngine C #

  9. 9

    tcl 스레드 내에서 proc 호출

  10. 10

    $ routeProvider 내부의 AngularJS 호출 메서드

  11. 11

    부모 메서드 호출

  12. 12

    메서드에서 스레드를 호출하는 방법

  13. 13

    완료시 다른 스레드에서 메서드 호출

  14. 14

    새 스레드 C에서 메서드 호출

  15. 15

    ndk의 다른 스레드에서 Java 메서드 호출

  16. 16

    메서드에서 메서드 호출

  17. 17

    자바에서 이미 시작된 스레드 내부에서 코드 호출

  18. 18

    조각 내에서 메서드 호출

  19. 19

    typescript에서 부모 메서드 호출

  20. 20

    NavigationManager.LocationChanged 내부에서 비동기 메서드 호출

  21. 21

    BroadcastReceiver에서 Activity 내부의 메서드 호출

  22. 22

    개체 내부에서 메서드 호출

  23. 23

    Swift : init 내부에서 자체 메서드 호출

  24. 24

    Fragment 내부에서 Activity 메서드를 호출하는 방법

  25. 25

    모델 내부에서 메서드 호출

  26. 26

    Python 다른 메서드 내부에서 메서드를 호출하는 방법

  27. 27

    메서드 내부에서 메서드를 다시 호출해도됩니까?

  28. 28

    PHP : 동일한 클래스 내에서 내부 (Function) 메서드 호출

  29. 29

    모든 병렬 클래스 스레드의 메서드 호출

뜨겁다태그

보관