En Java, les textes de classe appartenant à la ville, les textes édités, les textes édités, les textes édités, les textes édités, les textes édités, les textes édités, et les textes édités et modifiés, Comment augmenter, ainsi qu'une entrée profonde, syllabaire et réduction peu exigeante.
创 Objet KEN Maven, Javassist à tirer 库
<!-- https://mvnrepository.com/artifact/javassist/javassist -->
<dependency>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.12.1.GA</version>
</dependency>
Utilisez le javassiste Kenichi Kuruma Personal
package com.y4er.learn;
import javassist.*;
public class CreateClass {
public static void main(String[] args) throws Exception {
//获 tori javassist
ClassPool pool = ClassPool.getDefault();
//创 军 决.y4er.learn.Person
CtClass ctClass = pool.makeClass("com.y4er.learn.Person");
//给 ctClass type addition 1 pièce type de chaîne type caractère nom de l'étape
CtField name = new CtField(pool.get("java.lang.String"), "name", ctClass);
//Réglage privé
name.setModifiers(Modifier.PRIVATE);
//Nom d'initialisation étape de caractère zhangsan
ctClass.addField(name, CtField.Initializer.constant("zhangsan"));
//Générer la méthode get, set
ctClass.addMethod(CtNewMethod.getter("getName",name));
ctClass.addMethod(CtNewMethod.setter("setName",name));
//Numéro de boîte de construction sans additif
CtConstructor ctConstructor = new CtConstructor(new CtClass[]{}, ctClass);
ctConstructor.setBody("{name=\"xiaoming\";}");
ctClass.addConstructor(ctConstructor);
//Structure de participation additive
CtConstructor ctConstructor1 = new CtConstructor(new CtClass[]{pool.get("java.lang.String")}, ctClass);
ctConstructor1.setBody("{$0.name=$1;}");
ctClass.addConstructor(ctConstructor1);
//Jian Jian une méthode publique printName()Pas de participation, pas de retour
CtMethod printName = new CtMethod(CtClass.voidType, "printName", new CtClass[]{}, ctClass);
printName.setModifiers(Modifier.PUBLIC);
printName.setBody("{System.out.println($0.name);}");
ctClass.addMethod(printName);
//Copier le texte du cours
ctClass.writeFile();
ctClass.detach();
}
}
Terminé après l'achèvement de la production Person.class
Classe représentative CtClass dans javassist, conteneur ClassPool CtClass, ClassPool 维 护 虤 证 , CtClass.detach () pour l'ajustement de la demande.
Priorité ClassPool Oui En dessous de la méthode individuelle:
Plus de formulaire du trésorier: http://www.javassist.org/html/javassist/ClassPool.html
Méthode liée à la demande CtClass:
Étapes: http://www.javassist.org/html/javassist/CtClass.html
Acceptation CtMethod CtBehavior, méthode liée à la demande:
Plus d'étapes: http://www.javassist.org/html/javassist/CtBehavior.html
Actuellement setBody () Nakaga 们 utilise le numéro représentatif du code $
// $0 représentant ce$1 Classement du 1er numéro d'inscription individuel représentatif
printName.setBody("{System.out.println($0.name);}");
Au-dessus de la phrase, j'ai généré un Person.class conforme à l'opposition ctClass, 怎么 pour l'ajustement Opposition de génération de type de personne, attribut d'ajustement ou méthode?
Trois méthodes:
//Illustrative
Object o = ctClass.toClass().newInstance();
Method setName = o.getClass().getMethod("setName", String.class);
setName.invoke(o,"Y4er");
Method printName1 = o.getClass().getMethod("printName");
printName1.invoke(o);
ClassPool pool = ClassPool.getDefault();
pool.appendClassPath("E:\\code\\java\\javassist-learn\\com\\y4er\\learn");
CtClass PersonClass = pool.get("com.y4er.learn.Person");
Object o = PersonClass.toClass().newInstance();
//Pour le réglage de la réflexion subordonnée
Port de contact nouvellement construit IPerson, méthode générale de type Personne Tout résumé
package com.y4er.learn;
public interface IPerson {
String getName();
void setName(String name);
void printName();
}
ClassPool pool = ClassPool.getDefault();
pool.appendClassPath("E:\\code\\java\\javassist-learn\\com\\y4er\\learn\\Person.class");
CtClass IPerson = pool.get("com.y4er.learn.IPerson");
CtClass Person = pool.get("com.y4er.learn.Person");
Person.defrost();
Person.setInterfaces(new CtClass[]{IPerson});
IPerson o = (IPerson) Person.toClass().newInstance();
o.setName("aaa");
System.out.println(o.getName());
o.printName();
Général Type de personne Le point de contact IPerson réel, type de conversion directe au moment du cas réel, peut être directement ajusté.
javassiste La majorité des affaires de rénovation et de rénovation de type, le visage de l'épéiste. Mon usage personnel
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package com.y4er.learn;
public class Person implements IPerson {
private String name = "zhangsan";
public String getName() {
return this.name;
}
public void setName(String var1) {
this.name = var1;
}
public Person() {
this.name = "xiaoming";
}
public Person(String var1) {
this.name = var1;
}
public void printName() {
System.out.println(this.name);
}
}
En ce moment, mes pensées printName
------ printName start ------
xiaoming
------ printName over ------
Shaichi Shimodai:
pool.appendClassPath("E:\\code\\java\\javassist-learn\\com\\y4er\\learn\\Person.class");
CtClass Person = pool.get("com.y4er.learn.Person");
Person.defrost();
CtMethod printName1 = Person.getDeclaredMethod("printName", null);
printName1.insertBefore("System.out.println(\"------ printName start ------\");");
printName1.insertAfter("System.out.println(\"------ printName over ------\");");
Object o = Person.toClass().newInstance();
Method printName2 = o.getClass().getMethod("printName");
printName2.invoke(o, null);
Réalisation de Tsujimatsu visage terminé