2017-02-03 5 views
0

J'ai deux questions qui ont une relation.Modifier la déclaration et la construction d'un objet en JAVA

La première question est de savoir s'il y a une approche de déclarer la mise en œuvre d'une interface en Java pendant le temps d'exécution afin d'éviter l'erreur suivante:

IObject obj = new Object(); 

L'objet de l'objet n'implémente pas l'interface IObject .

La deuxième question est que je veux changer la déclaration et la construction d'un objet dans Java afin de créer son proxy. Après vous pouvez voir un exemple.

Le code source que je veux changer est:

Object obj = new Object(); 

L'objet cible que je veux atteindre est la suivante:

IObject objProxy = (IObject) ProxyFactory.generateProxy(new Object()); 

Merci beaucoup

Répondre

2

Vous peut changer de classe dans un programme Java. Cependant, vous devrez appliquer les modifications pendant la construction et avant d'exécuter votre programme. Cela vous limite aux classes que vous définissez et exclut les classes JVM qui ne font pas partie de votre artefact.

Une approche possible serait d'utiliser Byte Buddy qui offre un mécanisme pour écrire Plugin qui sont déclenchés lors de la construction.

Le code ci-dessus montre comment implémenter IObject pour une classe nommée pkg.Object:

public class SimplePlugin implements Plugin { 
    @Override 
    public boolean matches(TypeDescription target) { 
    return target.getName().equals("pkg.Object"); 
    } 
    @Override 
    public DynamicType.Builder<?> apply(
    DynamicType.Builder<?> builder, 
    TypeDescription typeDescription 
) { 
    return builder.implement(IObject.class); 
    } 
} 

Vous pouvez activer le plug-in à exécuter au cours de votre Maven construire par ce qui suit:

<plugin> 
    <groupId>net.bytebuddy</groupId> 
    <artifactId>byte-buddy-maven-plugin</artifactId> 
    <executions> 
    <execution> 
     <goals> 
     <goal>transform</goal> 
     </goals> 
    </execution> 
    </executions> 
    <configuration> 
    <transformations> 
     <transformation> 
     <plugin>pkg.SimplePlugin</plugin> 
     </transformation> 
    </transformations> 
    </configuration> 
</plugin> 

En ce qui concerne En remplaçant la construction de l'objet, vous devrez changer le code d'octet de la classe. Vous devez détecter toute instruction créant une instance de votre classe et la remplacer par un appel en usine. Vous pouvez le faire en utilisant ASM qui est exposée par Byte Buddy via le AsmVisitorWrapper.