[CORRIGIDO]
olá pessoa, estou com um problema de cast de tipo com proxy.
Por exemplo, no codigo abaixo, é feito um lookup de um ejb e armazenado num objeto Object. A priori, nao conheço a interface que esse ejb implementa, mas sei que ela é a mesma interface usada na declaração do campo da classe representada pelo objeto field.
O problema é que se usar o metodo set do object java.lang.reflect.Field e usar o object ejb (que na verdade eh um proxy para o ejb real do servidor) como argumento, ele lança um IllegalArgumentException.
A linha comentada (1) funciona normalmente, mas nao a (2)
Field fields[] = clazz.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
Object ejb = new InitialContext().lookup(jndiName);
Class clazz = Class.forName(field.getType().getCanonicalName());
// (1) LoginFacade ejbCast = (LoginFacade)clazz.cast(ejb);
// (2) field.set(clazz, (LoginFacade)clazz.cast(ejb));
field.set(clazz, clazz.cast(ejb));
}
Existe alguma maneira de atribuir o objeto ejb (proxy) nesse campo representado por field ?
Obrigado 
qual JDK vc esta compilando?
estou compilando no java 6
Olá.
- A questão é que o contrato para o campo em que você está atribuindo um valor não está sendo obedecido, pois provavelmente seu objeto proxy não possui tal campo “field”.
Neste caso, seria necessário que seu objeto tivesse uma instância no qual o objeto field existisse. Não seria melhor você usar acesso a métodos que campos? pois você tem que garantir acesso ao campo (ser acessível) e não é tão elegante.
- Não acredito que seja problema relacionado a unwrapping, pois seu objeto é um ejb também.
Este código:
Object ejb = new InitialContext().lookup(jndiName);
Retire-o da interação.
- Outra coisa que notei:
Você está chamando o método da classe e não de uma instância.
Deveria trocar o código no final para:
Object obj = clazz.newInstance();
field.set(obj, clazz.cast(ejb));
Att.
consegui resolver o problema, obrigado 
bem, na verdade, eu tava dando uma de bios (bicho ignorante operando sistema) pq nao li direito a documentacao sobre reflexao. o q tava querendo fazer era um meio de fazer injecao de dependencia de ejb no action do struts2. depois foi visto onde estava o erro :P. mas bem, para nao deixar o post sem muita informacao util, vou postar aqui parte do codigo fonte. aqui eh o interceptor q cuida de injetar o ejb no action. sei q o spring faz isso, mas queria fazer um tb pq queria colocar outro comportamento nisso.
abraços e vlw pessoal 
public String intercept(ActionInvocation actionInvoc) throws Exception {
Class clazz = actionInvoc.getAction().getClass();
Field fields[] = clazz.getDeclaredFields();
Map session = actionInvoc.getInvocationContext().getSession();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
StatefullEjbLookUp statefullEjbAnnot = field.getAnnotation(StatefullEjbLookUp.class);
if (statefullEjbAnnot != null) {
String ejbSessionName = actionInvoc.getAction().getClass().getSimpleName() + "_" + statefullEjbAnnot.jndiName();
Object ejbBean = session.get(ejbSessionName);
field.setAccessible(true);
if (ejbBean == null) {
String jndiName = statefullEjbAnnot.option() + statefullEjbAnnot.jndiName();
try {
Object ejb = new InitialContext().lookup(jndiName);
field.set(actionInvoc.getAction(), ejb);
session.put(ejbSessionName, ejb);
} catch (Exception e) {
e.printStackTrace();
}
} else {
field.set(actionInvoc.getAction(), ejbBean);
}
}
StatelessEjbLookUp statelessEjbAnnot = field.getAnnotation(StatelessEjbLookUp.class);
if (statelessEjbAnnot != null) {
try {
String jndiName = statelessEjbAnnot.option() + statefullEjbAnnot.jndiName();
Object ejb = new InitialContext().lookup(jndiName);
field.set(actionInvoc.getAction(), ejb);
} catch (Exception e) {
e.printStackTrace();
}
}
}
return actionInvoc.invoke();
}
Olá.
Entendi seu código. Por isso havia comentado que usar field.set em Class não adiantaria, somente em Object. 
o seu código injeta o objeto ejb no Map do HttpSession. Você está retirando ele da memória? ou isso é feito automaticamente pelo SessionBean, ao executar o remove?
Talvez fosse interessante implementar um controlador de beans em sessão, por exemplo. Para controlar os objetos em memória, de acordo com a bijeção de seu ejb.
De qualquer forma, coloque o tópico como CORRIGIDO, isso ajuda a comunidade.
Att.
ops…
troque:
o seu código injeta o objeto ejb no Map do HttpSession
por:
o seu código insere o objeto ejb no Map do HttpSession 8)
bem, na verdade o codigo insere e injeta o ejb. injeta no action atraves de uma anotacao (como o @ejb) e insere na sessao http do usuario.
o codigo nao tira o statefull ejb da sessao do usuario. to usando o transaction type como extended e atrelando o ejb na sessao para manter o estado conversacional (acho q eh assim q escreve
).
a razao de nao tirar o codigo eh pq o ciclo de vida do ejb (statefull) eh parecido com o ciclo de vida do http session. entao, quando a sessao do usuario morrer, o ejb irá morrer depois. mas eh algo q quero testar melhor pra ter certeza se o metodo eh eficiente ou nao, ou se tenho q me preocupar com o uso despreocupado de recursos do sistema.
desconfio q nao pq uma vez implementei um sistema web usando jdbc puro (velhos tempos, mas nao sou tao velho
) e nao fechava o Connection, entao colocava um numero ilimitado de objetos no poll do tomcat para conexao com o banco. a memoria do sistema acabava de 6 em 6 meses, com bastante acesso, numa maquiina de 1Gb de mem fisica. eh um metodo de resolver as coisas tipico do Chuck Norris, mas na epoca era o jeito 
uma coisa q me preocupa no codigo eh o tratamento necessario quando o ejb estiver num estado de semi-vida, isto eh, de alguma forma inutilizado ou ‘desconectado’ com o servidor, se eh q isso possa acontecer. mas enfim, se pode acontecer, entao teria q implementar mesmo um controlador de beans em sessao como vc disse.
nao estou com o codigo fonte comigo agora, mas ficaria algo assim no action, onde eh feita a injecao de dependencia.
public class UmActionDoStruts2{
@EjbStatefull(name = "LoginFacade/local")
private LoginFacade login;
public jahUsandoOObjetoInjetadoNoInterceptor(){
login.autenticar("nome", "senha");
}
}
adorei brincar com anotacoes e interceptors no struts2 xD