Showing posts with label fields. Show all posts
Showing posts with label fields. Show all posts

Saturday, 2 May 2020

Javassist: Add new fields to existing class

Step 1: Instantiate ClassPool object.
ClassPool pool = ClassPool.getDefault();

Step 2: Get CtClass instance
CtClass ctClass = pool.get("com.sample.app.model.Employee");

Step 3: Define a field           
CtField ctField = new CtField(CtClass.doubleType, "salary", ctClass);
ctField.setModifiers(Modifier.PUBLIC);

Step 4: Add this field to CtClass instace.
ctClass.addField(ctField);

Find the below working application.

Employee.java
package com.sample.app.model;

public class Employee {
 private int id;
 private String name;

 public int getId() {
  return id;
 }

 public void setId(int id) {
  this.id = id;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

}

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.get("com.sample.app.model.Employee");
  
  CtField ctField = new CtField(CtClass.doubleType, "salary", ctClass);
  ctField.setModifiers(Modifier.PUBLIC);
  
  ctClass.addField(ctField);
  ctClass.writeFile("/Users/Shared/assistDemos");
 }
}

Run App.java.

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

4 directories, 1 file
Open Employee.class file in java decompiler to see the source code.

Previous                                                    Next                                                    Home

Monday, 27 April 2020

Javassist: Add static field to a class

Follow below steps to create public static final field in a class.

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

Step 2: Get CtClass instance.
CtClass demoClass = classPool.makeClass("com.sample.app.model.Demo");

Step 3: Create new CtField using public static and final modifiers.
CtField ctField = new CtField(CtClass.doubleType, "PI", demoClass);
ctField.setModifiers(Modifier.STATIC | Modifier.FINAL | Modifier.PUBLIC);

Step 4: Add the created field to demoClass.       
demoClass.addField(ctField, "3.14");

Find the below working application.

App.java
package com.sample.app;

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

public class App {

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

        CtClass demoClass = classPool.makeClass("com.sample.app.model.Demo");

        CtField ctField = new CtField(CtClass.doubleType, "PI", demoClass);
        ctField.setModifiers(Modifier.STATIC | Modifier.FINAL | Modifier.PUBLIC);
        
        demoClass.addField(ctField, "3.14");

        demoClass.writeFile("/Users/Shared/javassist");

    }
}

Run App.java.

You can see Demo.class file is created at /Users/Shared/javassist
$tree /Users/Shared/javassist
/Users/Shared/javassist
└── com
    └── sample
        └── app
            └── model
                └── Demo.class

4 directories, 1 file

Open Demo.class file in Java decompiler to see the source code.



Previous                                                    Next                                                    Home

Javassist: Add non-primitive fields to a class

Follow below step by step procedure to add non-primitive field to a class.

Step 1: Define Class Point.
public class Point {
    .....
    .....
}

Step 2: Get an instance of ClassPool.
ClassPool classPool = ClassPool.getDefault();

Step 3: Get CtClass instance.
CtClass ctClass = classPool.makeClass("com.sample.app.model.Demo");

Step 4: Get CtClass instance for Point class.
CtClass pointClass = classPool.get("com.sample.app.model.Point");

Step 5: Define CtField using pointClass.
CtField ctField = new CtField(pointClass, "point", ctClass);

Step 6: Add the field to CtClass.
ctClass.addField(ctField);

Find the below working application.

Point.java
package com.sample.app.model;

public class Point {
    private int x;
    private int y;

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

}

App.java
package com.sample.app;

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

public class App {

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

        CtClass ctClass = classPool.makeClass("com.sample.app.model.Demo");

        CtClass pointClass = classPool.get("com.sample.app.model.Point");
        CtField ctField = new CtField(pointClass, "point", ctClass);

        ctClass.addField(ctField);
        
        ctClass.writeFile("/Users/Shared/javassist");
    }
}

Run App.java.

You can observe Demo.class file is created at "/Users/Shared/javassist".
$tree /Users/Shared/javassist
/Users/Shared/javassist
└── com
    └── sample
        └── app
            └── model
                └── Demo.class

4 directories, 1 file

Open Demo.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

Sunday, 22 March 2020

Swagger Editor: Specify required fields in the reusable components

Using 'required' element, you can specify the required fields.
components:
  schemas:
    employee:
      type: object
      required: 
        - firstName
        - id
      properties:
        id:
          type: integer
          example: 1234
        firstName:
          type: string
          example: krishna
        lastName:
          type: string
          example: gurram

data.yaml
openapi: 3.0.0
info:
  title: Customer Data Aceess API
  description: API to expose all the CRUD operations on  customers
  contact:
    name: Krishna
    email: krishna123@abc.com
    url: https://self-learning-java-tutorial.blogspot.com/
  version: 1.0.0
paths:
  /employees/{employeeId}:
    get:
      parameters: 
      - in: path
        name: employeeId
        required: true
        schema:
          type: integer
          example: 123
      responses:
        200:
          description: Get Specific Employee Details
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/employee'
  /employees:
      post:
        description: Add new employee to the organization
        requestBody:
          content:
            application/json:
              schema:
                type: object
                properties:
                  firstName:
                    type: string
                    example: krishna
                  lastName:
                    type: string
                    example: gurram
        responses:
          201:
            description: New Employee is created
            content:
              application/json:
                schema:
                  $ref: '#/components/schemas/employee'
                  
      get:
        parameters: 
          - in: query
            name: from
            description: Page number to return
            required: true
            schema:
              type: integer
              example: 1
          - in: query
            name: size
            description: Number of elements to return
            required: false
            schema:
              type: integer
              example: 10
              minimum: 10
              maximum: 100
          - in: header
            name: onetime_token
            description: token to be used at the time of login
            required: false
            schema:
              type: string
              example: 08c3372a-9314-49d6-b9dd-ff212c1715a5
        responses:
          200:
            description: List of all the employees in organization
            content:
               application/json:
                  schema:
                    type: array
                    items:
                      $ref: '#/components/schemas/employee'

components:
  schemas:
    employee:
      type: object
      required: 
        - firstName
        - id
      properties:
        id:
          type: integer
          example: 1234
        firstName:
          type: string
          example: krishna
        lastName:
          type: string
          example: gurram
Add the content of data.yaml to swagger editor, you can see that the fields id, firstName of the component Employee are attached with * symbol in red color.



Previous                                                    Next                                                    Home

Friday, 1 November 2019

Spring boot: GraphQL: fields


In GraphQL query, you can ask for specific fields(For example, first name and email of the employees) information.

For example,
{
    employees {
        firstName
        email
        lastName
      permanentAddress{
        city
      }
    }
}

Above query requests for all the employees firstName, email, lastName and city field of permanentAddress type.


When you ran above query, you will get beow kind of response.
{
  "data": {
    "employees": [
      {
        "firstName": "ram",
        "email": "krishna@abc.com",
        "lastName": "Gurram",
        "permanentAddress": {
          "city": "Bangalore"
        }
      },
      {
        "firstName": "Joel",
        "email": "joel@abc.com",
        "lastName": "Chelli",
        "permanentAddress": {
          "city": "Chennai"
        }
      },
      {
        "firstName": "Gopi",
        "email": "gopi@abc.com",
        "lastName": "Battu",
        "permanentAddress": {
          "city": "Bangalore"
        }
      }
    ]
  }
}

As you see the response, you can confirm that GraphQL returns exactly the fields that are requested in query.


Previous                                                    Next                                                    Home