Java에서 Reflection API를 사용하여 파일을 구문 분석 한 후 런타임에 클래스를 생성하는 것과 관련된 솔루션을 만들었습니다.바인딩 - Java
while ((line = textReader.readLine()) != null)
{
Pattern p = Pattern
.compile("([^:]+):([^:]+)::([\\d]+)::([^:]+)::(.+)");
Matcher m = p.matcher(line);
if (m.find())
{
String id = m.group(1);
String className = m.group(2);
int orderOfExecution = Integer.valueOf(m.group(3));
String methodNameOrNew = m.group(4);
Object[] arguments = m.group(5).split("::");
if (methodNameOrNew.compareTo("new") == 0)
{
System.out.println("Loading class: " + className);
if (className.contains("Competition"))
{
continue;
}
else if (className.contains("$"))
{
continue;
}
else
{
Class<?> cl = Class.forName(className);
printMembers(cl.getConstructors(), "Constructor");
Constructor<?>[] cons = cl.getConstructors();
Object obj = cons[0].newInstance(arguments);
this.map.put(id, obj);
}
}
}
}
및 printMembers()
:
Loading class: org.powertac.common.TariffSpecification
Constructor:
public org.powertac.common.TariffSpecification(org.powertac.common.Broker,org.powertac.common.enumerations.PowerType)
java.lang.IllegalArgumentException: argument type mismatch
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at Parser.parse(Parser.java:64)
at Parser.main(Parser.java:137)
arguments[]
은 다음과 같습니다 : 1 : CONSUMPTION
private static void printMembers(Member[] mbrs, String s)
{
out.format("%s:%n", s);
for (Member mbr : mbrs)
{
if (mbr instanceof Field)
out.format(" %s%n", ((Field) mbr).toGenericString());
else if (mbr instanceof Constructor)
out.format(" %s%n", ((Constructor) mbr).toGenericString());
else if (mbr instanceof Method)
out.format(" %s%n", ((Method) mbr).toGenericString());
}
if (mbrs.length == 0)
out.format(" -- No %s --%n", s);
out.format("%n");
}
그러나, 나는 다음과 같은 오류가 발생합니다. 올바른 생성자를 만들고 적절한 인수 (유형)를 부여하려면 어떻게해야합니까? 예를 들어 , 샘플 파서 내가 사용하고 내가 가진 :
2233:org.powertac.common.Tariff::6::new::6
그때 내가 유형 org.powertac.common.Tariff
의 class
(new
새로운 오브젝트가 작성 될 필요하고, 그것이 double rate
소요 하더군요을 만들어야합니다 이 경우에는 6
인데, double
이면 인수가 String
(6
)이됩니다. 올바른 유형으로 생성/변환/캐스팅을하고 생성자에 할당 할 수 있습니까? 첫 번째 생각은 기호 테이블을 만드는 것이었지만 더 쉬운 해결책에 대해 궁금합니다.
호기심 때문에, 일반적으로 해결하려는 것은 무엇입니까? 그리고 표준 Java 직렬화 메커니즘 (직렬화 API, xml/json에 지속성 등)을 사용하지 않는 이유 – udalmik
@mudalov 좀 더 자세한 정보를 제공 할 수 있습니까? – cybertextron