답변:
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를 검색하십시오.
이런 종류의 일은 쉽지 않습니다. 정적 메소드를 호출하는 메소드는 다음과 같습니다.
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에서는 리플렉션을 사용할 수 없습니다
나는 당신이 무엇을 성취하려고하는지 잘 모르겠지만, 수업을 통과하는 것이 실제로 해야하는 것이 아닐 수도 있습니다. 대부분의 경우 이와 같은 클래스를 처리하는 것은 일부 유형의 팩토리 패턴 내에 쉽게 캡슐화되며 인터페이스를 통해 사용됩니다. 다음은 해당 패턴에 관한 수십 가지 기사 중 하나입니다. http://today.java.net/pub/a/today/2005/03/09/factory.html
팩토리 내에서 클래스를 사용하는 것은 다양한 방법으로 달성 될 수 있으며, 가장 중요한 것은 필요한 인터페이스를 구현하는 클래스 이름이 포함 된 구성 파일을 갖는 것입니다. 그런 다음 팩토리는 클래스 경로에서 해당 클래스를 찾아 지정된 인터페이스의 객체로 구성 할 수 있습니다.
다음을 참조하십시오 : http://download.oracle.com/javase/tutorial/extra/generics/methods.html
다음은 템플릿 메소드에 대한 설명입니다.
Java의 리플렉션 자습서 및 리플렉션 API를 살펴보십시오.
https://community.oracle.com/docs/DOC-983192 여기에 링크 설명을 입력하십시오
과
http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html
paramater로서의 클래스. 예.
세 가지 수업 :
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);
}
}
터미널 메소드 hackCar ()에서 TestCar 클래스를 매개 변수로 사용하십시오.