programing

Java에서 클래스를 매개 변수로 전달하려면 어떻게 해야 합니까?

prostudy 2022. 6. 19. 18:07
반응형

Java에서 클래스를 매개 변수로 전달하려면 어떻게 해야 합니까?

Java에서 클래스를 매개 변수로 전달하고 해당 클래스에서 메서드를 실행할 수 있는 방법이 있습니까?

void main()
{
    callClass(that.class)
}

void callClass(???? classObject)
{
    classObject.somefunction
    // or 
    new classObject()
    //something like that ?
}

Google Web Toolkit을 사용하고 있는데 리플렉션을 지원하지 않습니다.

public void foo(Class c){
        try {
            Object ob = c.newInstance();
        } catch (InstantiationException ex) {
            Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

반사를 사용하여 메서드를 호출하는 방법

 import java.lang.reflect.*;


   public class method2 {
      public int add(int a, int b)
      {
         return a + b;
      }

      public static void main(String args[])
      {
         try {
           Class cls = Class.forName("method2");
           Class partypes[] = new Class[2];
            partypes[0] = Integer.TYPE;
            partypes[1] = Integer.TYPE;
            Method meth = cls.getMethod(
              "add", partypes);
            method2 methobj = new method2();
            Object arglist[] = new Object[2];
            arglist[0] = new Integer(37);
            arglist[1] = new Integer(47);
            Object retobj 
              = meth.invoke(methobj, arglist);
            Integer retval = (Integer)retobj;
            System.out.println(retval.intValue());
         }
         catch (Throwable e) {
            System.err.println(e);
         }
      }
   }

기타 항목

public void callingMethod(Class neededClass) {
    //Cast the class to the class you need
    //and call your method in the class
    ((ClassBeingCalled)neededClass).methodOfClass();
}

메서드를 호출하려면 다음과 같이 합니다.

callingMethod(ClassBeingCalled.class);

받아들일 수 있는 방법을 구축합니다.

public <T> void printClassNameAndCreateList(Class<T> className){
    //example access 1
    System.out.print(className.getName());

    //example access 2
    ArrayList<T> list = new ArrayList<T>();
    //note that if you create a list this way, you will have to cast input
    list.add((T)nameOfObject);
}

메서드를 호출합니다.

printClassNameAndCreateList(SomeClass.class);

클래스 유형을 제한할 수도 있습니다. 예를 들어, 이것은 내가 만든 라이브러리의 메서드 중 하나입니다.

protected Class postExceptionActivityIn;

protected <T extends PostExceptionActivity>  void  setPostExceptionActivityIn(Class <T> postExceptionActivityIn) {
    this.postExceptionActivityIn = postExceptionActivityIn;
}

자세한 내용은 Reflection 및 Generics를 검색하십시오.

사용하다

void callClass(Class classObject)
{
   //do something with class
}

A Class는 Java 객체이기도 하므로 유형을 사용하여 참조할 수 있습니다.

자세한 내용은 공식 문서를 참조하십시오.

이런 일은 쉽지 않다.스태틱 메서드를 호출하는 메서드를 다음에 나타냅니다.

public static Object callStaticMethod(
    // class that contains the static method
    final Class<?> clazz,
    // method name
    final String methodName,
    // optional method parameters
    final Object... parameters) throws Exception{
    for(final Method method : clazz.getMethods()){
        if(method.getName().equals(methodName)){
            final Class<?>[] paramTypes = method.getParameterTypes();
            if(parameters.length != paramTypes.length){
                continue;
            }
            boolean compatible = true;
            for(int i = 0; i < paramTypes.length; i++){
                final Class<?> paramType = paramTypes[i];
                final Object param = parameters[i];
                if(param != null && !paramType.isInstance(param)){
                    compatible = false;
                    break;
                }

            }
            if(compatible){
                return method.invoke(/* static invocation */null,
                    parameters);
            }
        }
    }
    throw new NoSuchMethodException(methodName);
}

:잠깐만 업데이트하면 난 단지 그 질문에gwt 태그를 보았다.당신은 GWT에 리플렉션을 사용할 수 없다.

<>를 추가하면;T>만큼 반환 형식 나를 위해 일했다.Exjson로 deserialize 하기 위해

 public static <T> T fromJson(String json, Class<T> classOfT){
     return gson().fromJson(json, classOfT);
 }

나는 당신이 수행하려고 하고 있지만, 당신은 과목 시험에 통과하는 당신은 정말로 하고 있기가 필요하지 않을 수도 있기를 원할 지도 몰라 확실하지 않다.많은 경우에, 이런 등급을 다루는 쉽게 형식의 팩토리 패턴 안에 그것의 사용 인터페이스를 통해 이루어진다 캡슐화됩니다.여기 패턴:http://today.java.net/pub/a/today/2005/03/09/factory.html에 수많은 기사들을입니다.

공장 내에서 클래스를 사용하여 다양한 방법으로, 이 중 가장 두드러진 것에 필요한 인터페이스를 구현하는 클래스의 이름이 포함된 구성 파일을 가지고 병행될 수 있다.그리고 그 공장은 클래스 경로 내에서 지정된 인터페이스의 대상으로 그것의 구축 그 수업을 찾을 수 있다.

너 GWT 반영을 지원하지 않다고 말했다.당신은gwt 계층에서 반사 suppport에 gwt-ent 같은 반사 대신 지연된 바인딩,거나 제삼자 도서관을 사용해야 한다.

백세주와 이러한:http://download.oracle.com/javase/tutorial/extra/generics/methods.html

여기 템플릿 방법에 대한 explaniation 있다.

자바의 리플렉션 API:반사된 튜토리얼을 보시겠습니다.

https://community.oracle.com/docs/DOC-983192링크 설명을 여기에 입력하십시오.

그리고.

http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html

파라미터로서의 클래스예.

3개의 클래스:

class TestCar {

    private int UnlockCode = 111;
    protected boolean hasAirCondition = true;
    String brand = "Ford";
    public String licensePlate = "Arizona 111";
}

--

class Terminal {

public void hackCar(TestCar car) {
     System.out.println(car.hasAirCondition);
     System.out.println(car.licensePlate);
     System.out.println(car.brand);
     }
}

--

class Story {

    public static void main(String args[]) {
        TestCar testCar = new TestCar();
        Terminal terminal = new Terminal();
        terminal.hackCar(testCar);
    }

}

Class Terminal 메서드hackCar()에서는 클래스 TestCar를 파라미터로 사용합니다.

언급URL : https://stackoverflow.com/questions/4872978/how-do-i-pass-a-class-as-a-parameter-in-java

반응형