2012-05-28 3 views
1

프록시 패턴을 구현하기 위해 asm을 사용합니다. 예외 것보다 나는이 작업을 요청하면
원래 클래스 test.service.Service
동적으로 바이트를 생성합니다.

public class ProxyFactory{ 
    public static Object generateProxy(Class<?> argument){ 
     //do generate use asm. 
     //generate a proxyClass that extends argument 
     //and override the sayHello() method 
     //and than invoke System.out.println("anything") before we call super.sayHello() 
     Class<?> class = proxyClass; 
     return class.newInstance(); 
    } 
} 


public class Service implements IService{ 
    @Override 
    public List<String> sayHello(){ 
     List<String> list = new ArrayList<String>(); 
     list.add("stackoverflow user"); 
     return list; 
    } 
} 

public class Action extends ActionSupport{ 

    private IService service = ProxyFactory.generateProxy(Service.class); 

} 

입니다 : 예를 들어

java.lang.reflect.InvocationTargetException 일에서
java.lang.Thread.run에서 .reflect.NativeMethodAccessorImpl.invoke0 (기본 방법)
... (Thread.java:619는)
는에 의해 발생 : java.lang.NoClassDefFo undError : java.lang.ClassNotFoundException가 : java.lang.ClassLoader.defineClass1 (기본 방법)
...
... 40 개
에 의한에서 test.service.Service
test.service.Service
이는 java.net.URLClassLoader $의 1.run (URLClassLoader.java:200)에서 java.security.AccessController.doPrivileged (기본 방법)
... java.lang.ClassLoader.loadClass에서
(ClassLoader.java에서
: 252)
at java.lang.ClassLoader.loadClassInternal (ClassLoader.java:320)
... 43 more

위의 코드가 모두 응용 프로그램을 실행하면 작동 할 수 있기 때문에 Tomcat 클래스 로더 문제 인 것 같습니다. 문제를 해결하는 데 도움이 될 수 있습니다.
감사합니다.

+0

에 대한 세부 코드 예제를 업데이트하십시오 정의 우리의 클래스에 바람둥이 클래스 로더를 사용할 수 있음을 의미 전체 스택 추적을 게시하십시오 (예를 들어 게시 된 것이 사용자의 예제와 관련되지 않습니다. 예를 들어 거기에 generateProxy() 메소드 호출이 없습니다). –

답변

0

실제적으로 스스로 해결합니다. 문제는 클래스 로더가 원인입니다.
이것은 코드 앞에이다

byte[] b = class byte code... 
ClassLoder loader = ClassLoader.getSystemClassLoader(); 
Class<?> cls = Class.forName("java.lang.ClassLoader"); 
java.lang.reflect.Method method = cls.getDeclaredMethod(
       "defineClass", new Class[] { String.class, byte[].class, 
         int.class, int.class }); 
method.setAccessible(true); 
Object[] args = new Object[] { sc.getName(), b, new Integer(0), 
        new Integer(b.length) }; 
clazz = (Class<?>) method.invoke(loader, args); 

와 이제는 Thread.currentThread()를 사용하는 대신
ClassLoader.getSystemClassLoader의 getContextClassLoader()].

우리의 웹
응용 프로그램 클래스 "test.service.Service"을 찾을 수있는 것보다, 그래서 당신은 또한 proxyClass의 인스턴스를 얻고 우리가 어떻게

관련 문제