Link

Java in 30 Minutes

References

Table of contents

  1. Component
  2. Reflection
    1. Type Signature
  3. Java Verison
  4. Annotation

Component

  • Byte code verifier
    • Assures that no user program can crash the host machine or interfere with other operations on the host machine
    • Protect certain methods and data structures belonging to trusted code from access or corruption by untrusted code executing within the same JVM
    • Prevent corruptions caused by programmer errors
  • JDK (Development Kit)
    • JRE (Runtime envrionment)
      • Java virtual machine
      • Java class library
    • Some tools
      • javac, javadoc, jdb

Reflection

For every type of object, the Java virtual machine instantiates an immutable instance of java.lang.Class. It is the entry point for all of the Reflection APIs.

With the exception of java.lang.reflect.ReflectPermission, none of the classes in java.lang.reflect have public constructors. To get to these classes, it is necessary to invoke appropriate methods on Class.

Class c = "foo".getClass();

# If the type is available but there is no instance then it is possible to obtain a Class by appending ".class" to the name of the type.
boolean b;
Class c = b.getClass();   // compile-time error
Class c = boolean.class;  // correct

Class c = Class.forName("com.duke.MyLocaleServiceProvider");

Type Signature

  • Z: boolean
  • B: byte
  • C: char
  • S: short
  • I: int
  • J: long
  • F: float
  • D: double
  • L fully-qualified-class ;
  • [ type : for array
  • ( arg-types ) ret-type : method type
long f (int n, String s, int[] arr); 
(ILjava/lang/String;[I)J 

Object[3]
[Ljava.lang.Object;

Java Verison

  • Java SE (Standard Edition) 8 (LTS)
  • Java SE 11 (LTS)
  • EE (Enterprise Edition): an extension for SE

MacOS:

/usr/libexec/java_home -V     # list all 
export JAVA_HOME=`/usr/libexec/java_home -v 1.8`  # use SE 8

# remove jdk:
sudo rm -rf /Library/Java/JavaVirtualMachines/jdk<version>.jdk
# remove plugin
sudo rm -rf /Library/PreferencePanes/JavaControlPanel.prefPane
sudo rm -rf /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin
sudo rm -rf /Library/LaunchAgents/com.oracle.java.Java-Updater.plist
sudo rm -rf /Library/PrivilegedHelperTools/com.oracle.java.JavaUpdateHelper
sudo rm -rf /Library/LaunchDaemons/com.oracle.java.Helper-Tool.plist
sudo rm -rf /Library/Preferences/com.oracle.java.Helper-Tool.plist

Annotation

Annotations have no direct effect on the operation of the code they annotate. Annotations have a number of uses, among them:

  • Information for the compiler — Annotations can be used by the compiler to detect errors or suppress warnings.
  • Compile-time and deployment-time processing — Software tools can process annotation information to generate code, XML files, and so forth.
  • Runtime processing — Some annotations are available to be examined at runtime.
@Author(
   name = "Benjamin Franklin",
   date = "3/27/2003"
)
class MyClass() { ... }

// If there is just one element named value, then the name can be omitted:
@SuppressWarnings(value = "unchecked")
@SuppressWarnings("unchecked")
// Define annotation type
public @interface ClassPreamble {
   String author();
   String date();
   int currentRevision() default 1;
   String lastModified() default "N/A";
   String lastModifiedBy() default "N/A";
   // Note use of array
   String[] reviewers();
}

// Use
@ClassPreamble (
   author = "John Doe",
   date = "3/17/2002",
   currentRevision = 6,
   lastModified = "4/12/2004",
   lastModifiedBy = "Jane Doe",
   // Note array notation
   reviewers = {"Alice", "Bob", "Cindy"}
)

// TO make the information in @ClassPreamble appear in Javadoc-generated documentation:
import java.lang.annotation.*; // import this to use @Documented
@Documented
@interface ClassPreamble {
   // Annotation element definitions
}
// Repeatable Annotation Type
import java.lang.annotation.Repeatable;

@Repeatable(Schedules.class)
public @interface Schedule {
  String dayOfMonth() default "first";
  String dayOfWeek() default "Mon";
  int hour() default 12;
}
public @interface Schedules {
    Schedule[] value();
}

@Schedule(dayOfMonth="last")
@Schedule(dayOfWeek="Fri", hour="23")
public void doPeriodicCleanup() { ... }

Common practice:

public interface House { 
    /**
     * @deprecated use of open 
     * is discouraged, use
     * openFrontDoor or 
     * openBackDoor instead.
     */
    @Deprecated
    public void open(); 
    public void openFrontDoor();
    public void openBackDoor();
}
public class MyHouse implements House { 
    @SuppressWarnings("deprecation")
    public void open() {} 
    public void openFrontDoor() {}
    public void openBackDoor() {}
}