In Java die Klassentexte, die der Stadt gehören, die bearbeiteten Texte, die bearbeiteten Texte, die bearbeiteten Texte, die bearbeiteten Texte und die bearbeiteten und reparierten Texte. Wie man den tiefen Einstieg, die Silbe und die Reduktion erhöht und auch anspruchslos macht.
Maven-Gegenstand, einziehbarer Javassist
<!-- https://mvnrepository.com/artifact/javassist/javassist -->
<dependency>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.12.1.GA</version>
</dependency>
Verwenden Sie den Javassisten 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-Typaddition 1-teiliger String-Typ-Typ Zeichenstufenname
CtField name = new CtField(pool.get("java.lang.String"), "name", ctClass);
//Privat einstellen
name.setModifiers(Modifier.PRIVATE);
//Initialisierungsname Zeichen Stufe Zhangsan
ctClass.addField(name, CtField.Initializer.constant("zhangsan"));
//Generiere get, setze Methode
ctClass.addMethod(CtNewMethod.getter("getName",name));
ctClass.addMethod(CtNewMethod.setter("setName",name));
//Additivfreie Baukastennummer
CtConstructor ctConstructor = new CtConstructor(new CtClass[]{}, ctClass);
ctConstructor.setBody("{name=\"xiaoming\";}");
ctClass.addConstructor(ctConstructor);
//Additive Beteiligungsstruktur
CtConstructor ctConstructor1 = new CtConstructor(new CtClass[]{pool.get("java.lang.String")}, ctClass);
ctConstructor1.setBody("{$0.name=$1;}");
ctClass.addConstructor(ctConstructor1);
//Jian Jian eine öffentliche Methode printName()Keine Teilnahme, keine Rückkehr
CtMethod printName = new CtMethod(CtClass.voidType, "printName", new CtClass[]{}, ctClass);
printName.setModifiers(Modifier.PUBLIC);
printName.setBody("{System.out.println($0.name);}");
ctClass.addMethod(printName);
//Klassentext kopieren
ctClass.writeFile();
ctClass.detach();
}
}
Abgeschlossen nach Abschluss der Produktion Person.class
Repräsentative CtClass-Klasse in Javassist, ClassPool CtClass-Container, ClassPool 维 护 虤 证 , CtClass.detach () zur Bedarfsanpassung.
ClassPool-Priorität Ja unter der einzelnen Methode:
Weitere Formulare des Schatzmeisters: http://www.javassist.org/html/javassist/ClassPool.html
Bedarfsbezogene CtClass-Methode:
Schritte: http://www.javassist.org/html/javassist/CtClass.html
CtMethod Acceptance CtBehavior, nachfragebezogene Methode:
Weitere Schritte: http://www.javassist.org/html/javassist/CtBehavior.html
Derzeit verwendet setBody () Nakaga die Code-Repräsentativnummer $
// $0 Vertreter dies$1 Repräsentative 1. individuelle Eintragsnummer Klassifizierung
printName.setBody("{System.out.println($0.name);}");
Über dem Satz habe ich eine ctClass-Oppositions-konforme Person.class generiert, 怎么 zur Anpassung Opposition zur Generierung von Personentypen, Anpassungsattribut oder -methode?
Drei Methoden:
//Illustrativ
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();
//Zur untergeordneten Reflexionseinstellung
Neu erstellte IPerson mit einem Kontaktport, allgemeine Personentypmethode Alle Zusammenfassung
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();
Allgemeiner Personentyp Der tatsächliche IPerson-Kontaktpunkt, der direkte Konvertierungstyp zum Zeitpunkt des tatsächlichen Falls, kann direkt angepasst werden.
javassist Der Großteil der Sanierung und Renovierung für die Mehrheit der Menschen. Persönliche Art der Selbstnutzung:
//
// 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);
}
}
Zu diesem Zeitpunkt sind meine Gedanken 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);
Tsujimatsu Realization Completed Face