이 링크 에서 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] 삭제
몇 마디 만하겠습니다