Showing posts with label new class. Show all posts
Showing posts with label new class. Show all posts

Monday, 27 April 2020

Javassist: Add methods to the new class

Follow below steps to add new method to a class.

Step 1: Create an instance of ClassPool.
ClassPool pool = ClassPool.getDefault();

Step 2: Create new class using makeClass method
CtClass ctClass = pool.makeClass("com.sample.app.model.Point");

Step 3: Create a method using CtMethod.
CtMethod getX = CtNewMethod.make(Modifier.PUBLIC, CtClass.intType, "getX", null, null, "return x;", ctClass);

Step 4: Add getX method to the class.
ctClass.addMethod(getX);

Find the below working application.

App.java
package com.sample.app;

import java.lang.reflect.Modifier;

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtField;
import javassist.CtMethod;
import javassist.CtNewMethod;

public class App {

 public static void main(String args[]) throws Exception {
  ClassPool pool = ClassPool.getDefault();

  CtClass ctClass = pool.makeClass("com.sample.app.model.Point");

  CtField xField = new CtField(CtClass.intType, "x", ctClass);
  xField.setModifiers(Modifier.PRIVATE);

  CtField yField = new CtField(CtClass.intType, "y", ctClass);
  yField.setModifiers(Modifier.PRIVATE);

  ctClass.addField(xField);
  ctClass.addField(yField);

  CtMethod getX = CtNewMethod.make(Modifier.PUBLIC, CtClass.intType, "getX", null, null, "return x;", ctClass);
  CtMethod getY = CtNewMethod.make(Modifier.PUBLIC, CtClass.intType, "getY", null, null, "return y;", ctClass);

  CtMethod setX = new CtMethod(CtClass.voidType, "setX", new CtClass[] { CtClass.intType }, ctClass);
  setX.setBody("{ x = $1; }");

  CtMethod setY = new CtMethod(CtClass.voidType, "setY", new CtClass[] { CtClass.intType }, ctClass);
  setY.setBody("{ y = $1; }");

  ctClass.addMethod(getX);
  ctClass.addMethod(getY);
  ctClass.addMethod(setX);
  ctClass.addMethod(setY);

  Object obj = ctClass.toClass().newInstance();
  System.out.println("Class Name : " + obj.getClass());

  ctClass.writeFile("/Users/Shared/assistDemos");

 }
}

Run App.java, you will get below messages in console.

Class Name : class com.sample.app.model.Point

You can observe Point.class file is generated at folder /Users/Shared/assistDemos.
$ tree /Users/Shared/assistDemos
/Users/Shared/assistDemos
└── com
    └── sample
        └── app
            └── model
                └── Point.class

4 directories, 1 file

Open the .class file in java decompiler to see the source code.



Previous                                                    Next                                                    Home

Wednesday, 22 April 2020

Javassist: Add fields to new class

Step 1: Get instance of ClassPool
ClassPool pool = ClassPool.getDefault();

Step 2: Create new class using makeClass method.
CtClass ctClass = pool.makeClass("com.sample.app.model.Point");

Step 3: Define fields using CtField.
CtField xField = new CtField(CtClass.intType, "x", ctClass);
xField.setModifiers(Modifier.PRIVATE);

CtField yField = new CtField(CtClass.intType, "y", ctClass);
yField.setModifiers(Modifier.PRIVATE);

Step 4: Add fields to the class.
ctClass.addField(xField);
ctClass.addField(yField);

Find the below working application.

App.java
package com.sample.app;

import java.lang.reflect.Modifier;

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtField;

public class App {

 public static void main(String args[]) throws Exception {
  ClassPool pool = ClassPool.getDefault();

  CtClass ctClass = pool.makeClass("com.sample.app.model.Point");

  CtField xField = new CtField(CtClass.intType, "x", ctClass);
  xField.setModifiers(Modifier.PRIVATE);

  CtField yField = new CtField(CtClass.intType, "y", ctClass);
  yField.setModifiers(Modifier.PRIVATE);

  ctClass.addField(xField);
  ctClass.addField(yField);

  Object obj = ctClass.toClass().newInstance();
  System.out.println("Class Name : " + obj.getClass());

  ctClass.writeFile("/Users/Shared/assistDemos");

 }
}

Run App.java, you will see below messages in console.
Class Name : class com.sample.app.model.Point

You can observe Point.class file is generated at folder /Users/Shared/assistDemos.
$ tree /Users/Shared/assistDemos
/Users/Shared/assistDemos
└── com
    └── sample
        └── app
            └── model
                └── Point.class

4 directories, 1 file

Open the .class file in java decompiler to see the source code.



Previous                                                    Next                                                    Home

Javassist: Define new class at run time

Step 1: Get the instance of ClassPool.
ClassPool pool = ClassPool.getDefault();

ClassPool is the root class that controls the byte code modifications. It is a container of CtClass objects (CtClass object represent a class file).

Step 2: Use 'makeClass' method to define a class.
CtClass ctClass = pool.makeClass("com.sample.app.model.Point");

Find the below working applicatin.

App.java
package com.sample.app;

import javassist.ClassPool;
import javassist.CtClass;

public class App {

 public static void main(String args[]) throws Exception {
  ClassPool pool = ClassPool.getDefault();

  CtClass ctClass = pool.makeClass("com.sample.app.model.Point");
  
  Object obj = ctClass.toClass().newInstance();
  System.out.println("Class Name : " + obj.getClass());
  
  ctClass.writeFile("/Users/Shared/assistDemos");

 }
}

Run App.java, you will see below message in console.
Class Name : class com.sample.app.model.Point

You can observe Point.class file is generated at folder /Users/Shared/assistDemos.

$ tree /Users/Shared/assistDemos
/Users/Shared/assistDemos
└── com
    └── sample
        └── app
            └── model
                └── Point.class

4 directories, 1 file

Open the .class file in java decompiler to see the source code.



Previous                                                    Next                                                    Home